{"record":{"id":"6e77e1072b8b7030","repo":"Blankj/AndroidUtilCode","slug":"u-can-t-instantiate-me-6e77e1","errorCode":null,"errorMessage":"u can't instantiate me...","messagePattern":"u can't instantiate me\\.\\.\\.","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java","lineNumber":34,"sourceCode":"import java.util.List;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipFile;\nimport java.util.zip.ZipOutputStream;\n\n/**\n * <pre>\n *     author: Blankj\n *     blog  : http://blankj.com\n *     time  : 2016/08/27\n *     desc  : utils about zip\n * </pre>\n */\npublic final class ZipUtils {\n\n    private static final int BUFFER_LEN = 8192;\n\n    private ZipUtils() {\n        throw new UnsupportedOperationException(\"u can't instantiate me...\");\n    }\n\n    /**\n     * Zip the files.\n     *\n     * @param srcFiles    The source of files.\n     * @param zipFilePath The path of ZIP file.\n     * @return {@code true}: success<br>{@code false}: fail\n     * @throws IOException if an I/O error has occurred\n     */\n    public static boolean zipFiles(final Collection<String> srcFiles,\n                                   final String zipFilePath)\n            throws IOException {\n        return zipFiles(srcFiles, zipFilePath, null);\n    }\n\n    /**\n     * Zip the files.","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/Blankj/AndroidUtilCode/blob/7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java#L16-L52","documentation":"ZipUtils is a final static-only utility for zip/unzip operations. Its private constructor throws UnsupportedOperationException to prevent instantiation. All public methods (zipFiles, unzipFile, etc.) are static.","triggerScenarios":"Reflective instantiation via ZipUtils.class.getDeclaredConstructor().setAccessible(true).newInstance(), or transitively through Gson/Jackson deserialization, Mockito/PowerMock, Kotlin reflection, or a DI classpath scan.","commonSituations":"Serialization frameworks binding a field to ZipUtils; mock frameworks in tests; coverage probes; accidental `new ZipUtils()` after weakening modifiers.","solutions":["Use static methods: ZipUtils.zipFiles(files, path) instead of constructing the class.","Provide a Gson InstanceCreator / Jackson mixin returning a sentinel so the constructor is not invoked.","Use Mockito.mockStatic for mocking rather than constructing ZipUtils.","Keep the class final with a private constructor."],"exampleFix":"// before\nZipUtils zu = new ZipUtils();\n\n// after\nZipUtils.zipFiles(fileList, \"/sdcard/out.zip\");","handlingStrategy":"validation","validationCode":"if (Modifier.isFinal(ZipUtils.class.getModifiers())) {\n  throw new IllegalStateException(\"ZipUtils is static-only.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Call ZipUtils.zipFiles(...) statically.","Register InstanceCreator/mixin for JSON fields.","Use Mockito.mockStatic for mocking.","Keep final + private constructor."],"tags":["android","utility-class","reflection","instantiation","zip"],"backgroundTag":null,"analyzedSha":"7b4caf9e5440046b3fefb63b6b6e2ead7ebaf809","analyzedAt":"2026-08-14T02:26:54.956Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}