SecurityException是Java中一个运行时异常,它表示在安全管理器检测到安全冲突时抛出。安全管理器用于控制代码在运行时执行的操作。如果操作被禁止,安全管理器将抛出SecurityException。
以下是安全管理器可能会禁止的操作:
- 读或写文件或目录
- 连接到网络
- 执行本地代码
- 从文件或URL中加载类
- 关闭JVM
- 等等
SecurityException通常是由于安全策略不允许某些操作而抛出的。当Java应用程序需要执行某些受限操作时,必须先配置安全策略文件以授权这些操作。如果在执行时发现没有授权,就会抛出SecurityException异常。
以下是两个示例说明:
示例1
下面的代码尝试读取文件系统中的文件,但是如果当前安全策略不允许读取文件系统,它将抛出SecurityException异常:
import java.io.*;
public class FileReadExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} catch (SecurityException e) { //捕获 SecurityException
e.printStackTrace();
}
}
}
如果没有授予程序读取文件系统的权限,那么就会输出以下内容:
java.security.AccessControlException: access denied ("java.io.FilePermission" "example.txt" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
at java.io.File.isFile(File.java:907)
at java.io.File.canRead(File.java:1082)
at java.io.BufferedReader.<init>(BufferedReader.java:86)
at java.io.BufferedReader.<init>(BufferedReader.java:128)
at FileReadExample.main(FileReadExample.java:7)
示例2
下面的代码尝试执行本地代码,但是如果当前安全策略不允许执行本地代码,它将抛出SecurityException异常:
import java.security.*;
public class LocalCodeExample {
public static void main(String[] args) {
try {
SecurityManager securityManager = new SecurityManager() {
@Override
public void checkPermission(Permission permission) {
if (permission.getName().startsWith("java.lang.RuntimePermission") && permission.getName().endsWith("loadLibrary")) {
throw new SecurityException("Executing local code is not allowed");
}
}
};
System.setSecurityManager(securityManager);
System.loadLibrary("mylibrary");
} catch (SecurityException e) { //捕获 SecurityException
e.printStackTrace();
}
}
}
如果没有授予程序执行本地代码的权限,那么就会输出以下内容:
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "loadLibrary.mylibrary")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.loadLibrary(System.java:1578)
at LocalCodeExample.main(LocalCodeExample.java:14)