Почему мой апплет выбрасывает AccessControlException?
Я пытаюсь построить апплет Java, под названием game
, чего я никогда не делал раньше (я всегда просто создавал автономные приложения). Мой апплет работает нормально, когда я тестирую его в Eclipse, но когда я пытаюсь разместить его на своем веб-сайте, я получаю следующую ошибку в консоли:
java.lang.reflect.InvocationTargetException
at com.sun.deploy.util.DeployAWTUtil.invokeAndWait(DeployAWTUtil.java:116)
at sun.plugin2.applet.Plugin2Manager.runOnEDT(Plugin2Manager.java:3541)
at sun.plugin2.applet.Plugin2Manager.createApplet(Plugin2Manager.java:3072)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1497)
at java.lang.Thread.run(Thread.java:680)
Caused by: java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
at java.lang.System.getProperty(System.java:667)
at java.io.UnixFileSystem.resolve(UnixFileSystem.java:118)
at java.io.File.getAbsolutePath(File.java:501)
at game.<init>(game.java:117)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at sun.plugin2.applet.Plugin2Manager$13.run(Plugin2Manager.java:3060)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:199)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:682)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:643)
at java.awt.EventQueue$1.run(EventQueue.java:641)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:652)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception: java.lang.reflect.InvocationTargetException
Это говорит access denied (java.util.PropertyPermission user.dir read)
, но я не могу понять, где он пытается что-то прочитать из файловой системы пользователя.
Это также говорит at game.<init>(game.java:117)
, но я вошел в свой файл и сделал вывод сообщения на консоль в строке 114, и он так и не был записан. Затем я понял, что, возможно, он смотрел на строку 117 внутри public game()
, поэтому я искал это, и это было начало слушателя для события мыши. Для меня имело смысл, что Java будет иметь разрешение на чтение, поэтому я удалил все, а затем удалил все импортные данные. Затем я очистил кэши Chrome и Java и повторил попытку. Та же ошибка
- Что это значит, я неправильно интерпретирую?
- Когда говорится, что строка 117, что это за строка 117?
- Почему это происходит?
- Как я могу это исправить?
- Как я могу предотвратить это в будущем?
Для справки вот код для public game()
:
public game() throws MalformedURLException{
JPanel board = new chessboard();
board.setSize(320, 320);
board.setLocation(0, 0);
System.out.println("Got this far");
Piece wp1 = new Piece(wpawn, a2);
...
Piece bk = new Piece(bking, e8);
board.add(wp1);
...
board.add(bk);
wp1.setLocation(wp1.square.getPoint());
...
bk.setLocation(bk.square.getPoint());
add(board);
repaint();
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent evt){
for (int i = 0; i < 8; i++){
for (int j = 0; j < 8; j++){
if (squares[i][j].piece != null)
System.out.println(squares[i][j].getPointString() + ": " + squares[i][j].piece.type);
}
}
Point p = evt.getPoint();
if (0 < p.x && p.x < 319 && 0 < p.y && p.y < 319){
Square clicked = getSquare(p);
System.out.println("up: " + clicked.getPointString());
if (clicked.piece != null){
pickedUp = true;
pickedUpPiece = clicked.piece;
}
}
}
public void mouseReleased(MouseEvent evt){
if (pickedUp){
Point p = evt.getPoint();
if (0 < p.x && p.x < 319 && 0 < p.y && p.y < 319){
System.out.println("down: " + getSquare(p).getPointString());
movePiece(pickedUpPiece, getSquare(p).getColumn(), getSquare(p).getRow());
}
pickedUp = false;
}
else System.out.println("Not picked up");
}
});
}
1 ответ
Ключевой результат трассировки стека:
at java.io.File.getAbsolutePath(File.java:501)
at game.<init>(game.java:117)
Это означает, что ваш game.java
файл в строке 117 вызывает getAbsolutePath()
на что-то. Java-апплетам, встроенным в браузер, не разрешен доступ к локальной файловой системе.