处理java.nio.file.AccessDeniedException

时间:2014-08-17 14:35:04

标签: java

我正在使用此代码从文件中读取值。

public String getChassisSerialNumber() throws IOException
{
    File myFile = new File("/sys/devices/virtual/dmi/id/chassis_serial");
    byte[] fileBytes;
    String content = "";
    if (myFile.exists()) 
    {          
        fileBytes = Files.readAllBytes(myFile.toPath());

        if (fileBytes.length > 0) 
        {
            content = new String(fileBytes);
        } 
        else 
        {
            return "No file";
        }
    } 
    else 
    {
        return "No file";
    }
    return null;
}

我收到此错误:

java.nio.file.AccessDeniedException: /sys/devices/virtual/dmi/id/chassis_serial
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)
    at java.nio.file.Files.newByteChannel(Files.java:361)
    at java.nio.file.Files.newByteChannel(Files.java:407)
    at java.nio.file.Files.readAllBytes(Files.java:3149)

我如何处理此错误?因为现在我的代码停止执行?有没有更好的方法不中断代码执行?

2 个答案:

答案 0 :(得分:1)

调用它时,必须在getChassisSerialNumber()内使用try-catch。 E.g。

try {
    getChassisSerialNumber();
} catch (java.nio.file.AccessDeniedException e) {
    System.out.println("caught exception");
}

OR

try {
    fileBytes = Files.readAllBytes(myFile.toPath());
} catch (java.nio.file.AccessDeniedException e) {
    return "access denied";
}

这样你的程序就不会终止。

对于干净的设计,如果你无法读取文件,你应该return null(返回“魔术字符串如”无文件“或”拒绝访问“都不是好设计,因为你不能区分这个字符串是否来自文件)捕获方法之外的异常(我的第一个例子)。

顺便说一下。只需将文件内容放入content变量中即可将其返回(即将content = new String(fileBytes);替换为return new String(fileBytes);

public String getChassisSerialNumber()
{
    File myFile = new File("/sys/devices/virtual/dmi/id/chassis_serial");
    if (myFile.exists()) 
    {          
        byte[] fileBytes;
        try {
            fileBytes = Files.readAllBytes(myFile.toPath());
        } catch (java.nio.file.AccessDeniedException e) {
            return null;
        }

        if (fileBytes != null && fileBytes.length > 0) 
        {
            return new String(fileBytes);
        } 
    } 
    return null;
}

答案 1 :(得分:1)

您应该捕获异常而不是抛出异常。我认为您需要在方法 getChassisSerialNumber 的调用周围放置一个try-catch块。

这样的事情应该适合你的情况:

String result = null;

try {
     result = getChassisSerialNumber();         
} catch (java.nio.file.AccessDeniedException ex) {
      // do something with the exception
      // you can log it or print some specific information for the user
}

return result; // if the result is null, the method has failed

为了更好地了解这类事情,您应该查看this page