{"record":{"id":"4ff00dff46f4f698","repo":"java-native-access/jna","slug":"filemonitor-not-implemented-for-os","errorCode":null,"errorMessage":"FileMonitor not implemented for \" + os","messagePattern":"FileMonitor not implemented for \" \\+ os","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"contrib/platform/src/com/sun/jna/platform/FileMonitor.java","lineNumber":138,"sourceCode":"\n    protected void finalize() {\n        for (File watchedFile : watched.keySet()) {\n            removeWatch(watchedFile);\n        }\n\n        dispose();\n    }\n\n    /** Canonical lazy loading of a singleton. */\n    private static class Holder {\n        public static final FileMonitor INSTANCE;\n        static {\n            String os = System.getProperty(\"os.name\");\n            if (os.startsWith(\"Windows\")) {\n                INSTANCE = new W32FileMonitor();\n            }\n            else {\n                throw new Error(\"FileMonitor not implemented for \" + os);\n            }\n        }\n    }\n\n    public static FileMonitor getInstance() {\n        return Holder.INSTANCE;\n    }\n}\n","sourceCodeStart":120,"sourceCodeEnd":147,"githubUrl":"https://github.com/java-native-access/jna/blob/d036ad9781adad4b66693e8fa7098e4ac665e0a3/contrib/platform/src/com/sun/jna/platform/FileMonitor.java#L120-L147","documentation":"FileMonitor's Holder static initializer throws an Error when the os.name system property does not start with \"Windows\", because only a W32FileMonitor implementation exists in this code path. Loading FileMonitor.getInstance() on any non-Windows platform aborts class initialization.","triggerScenarios":"Calling FileMonitor.getInstance() (or otherwise triggering Holder class init) on macOS, Linux, or any OS whose name does not start with \"Windows\".","commonSituations":"Running directory/file watching code developed for Windows on a Linux CI server or a Mac developer machine; os.name overridden via -Dos.name=... causing even Windows to fail.","solutions":["Only call FileMonitor.getInstance() after verifying Platform.isWindows()","Use a cross-platform file watcher (java.nio.file.WatchService) on non-Windows platforms","Check os.name at startup and disable file-monitor features on unsupported OSes"],"exampleFix":"// before\nFileMonitor fm = FileMonitor.getInstance();\n// after\nif (Platform.isWindows()) {\n    FileMonitor fm = FileMonitor.getInstance();\n} else {\n    WatchService ws = FileSystems.getDefault().newWatchService();\n}","handlingStrategy":"fallback","validationCode":"if (!System.getProperty(\"os.name\", \"\").startsWith(\"Windows\")) {\n    throw new IllegalStateException(\"FileMonitor requires Windows\");\n}","typeGuard":"boolean fileMonitorSupported() {\n    return Platform.isWindows();\n}","tryCatchPattern":"try {\n    monitor = FileMonitor.getInstance();\n} catch (Throwable t) {\n    monitor = null; // fall back to WatchService\n}","preventionTips":["Gate FileMonitor usage behind Platform.isWindows()","Prefer java.nio.file.WatchService for cross-platform watching","Never override os.name in production JVM flags"],"tags":["java","platform","file-monitor"],"backgroundTag":"unsupported-platform","analyzedSha":"d036ad9781adad4b66693e8fa7098e4ac665e0a3","analyzedAt":"2026-09-12T06:50:59.239Z","contentChangedAt":"2026-09-12T06:50:59.239Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}