【问题标题】:How to make java compiler ignore errors/warnings如何让java编译器忽略错误/警告
【发布时间】:2018-12-12 11:54:45
【问题描述】:

所以我有以下代码:

 public static Image getImage(String filepath, Class cl) {
    try {
        return ImageIO.read(cl.getResource(filepath));
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    return null;    // Will never execute
}

这是一个基本的 try-catch 块。如果我无法读取图像并将其返回,我会立即进入我的 catch 块。但是,因为我的 return 在 try 块的范围内,而不是在整个函数的范围内,所以当我尝试编译和运行时,我的编译器会发出错误,因为它认为我可能从未点击过 return 语句。因此,我添加了 return null;行来抑制这个警告,但我宁愿有一种更简洁的方式来做到这一点,而不需要放置永远不会运行的代码。我试过添加

@SuppressWarnings("all")

我的代码,但它仍然给我一个错误。有任何想法吗?我觉得应该有办法告诉编译器忽略这样的错误。

另外,如果有任何用处,我正在使用 IntelliJ 作为我的 IDE。

【问题讨论】:

  • "永远不会运行的代码" - 如果你的代码由于某种原因确实抛出了 IOException 怎么办?为什么你如此确定你永远不会遇到给定的文件路径只是......错误的情况?
  • 另外:这是“简洁”的做法。添加 Javadoc 注释说明:“@return 加载的图像,如果文件路径未指向现有文件,则返回 null”
  • @user2864740 我认为只有在最后一行return null 被注释掉时才会出现错误(这是他们想要做的,因为在他们眼中这条线无论如何都不会被执行)
  • 我不确定。抛出异常时,catch块后编译是否停止?还是我把 fail("message") 放在我的 catch 块中混淆了?
  • @stackUnderflow 执行不会简单地在 catch 上停止...明确地存在一个 catch 块,因此您的应用程序不会停止,但有时间实际处理问题。

标签: java


【解决方案1】:

我会建议 @LuCio 在 cmets 中急切地想说什么。只是不要捕获异常并将其向上传递:

public static Image getImage(String filePath, Class<?> clazz) throws IOException {
    return ImageIO.read(clazz.getResource(filePath));
}

这样你就创建了一个简单的辅助方法。如果要返回 null,则必须在 JavaDoc 中记录它,并且每个调用者都必须使用not-null 断言逻辑,然后如果它为 null,则抛出错误。

try catch 块也是如此。因此,您无需向上传递 null ,而是向上传播异常。你在某处说你想将 Image 分配给一个静态字段,所以你可以像这样轻松地做到这一点:

static {
    try {
         MY_IMAGE = getImage("somepath", MyClass.class);
    } catch(IOException e){
        throw new IOError(e); // will kill the Vm with an error
    }
}

但也许在某个地方你有另一个动作。而不是仅仅杀死虚拟机。也许使用默认图像:

final Image image;
try {
    image = getImage("somepath", MyClass.class);
} catch(IOException e){
    e.printStacktrace();
    image = new SomeDefaultImage();
}

// do something with image

总之就是要走的路。你不能有一个辅助方法来决定当它失败时要做什么。这应该始终由调用代码完成。

【讨论】:

  • 虽然意图很明确,但第一个代码示例中有两个语法错误。应该是:return ImageIO.read(clazz.getResource(filePath));
【解决方案2】:

好吧,我相信我混淆了 catch 块的目的。感谢@Ben 和@Zephyr 以及其他所有人的帮助。我将修改我的代码:

public static Image getImage(String filepath, Class cl) {
    try {
        return ImageIO.read(cl.getResource("hello"));
    } catch (IOException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
        throw new IOError(e);
    }
}

编辑:经过更多讨论,并查看了其他人发布的其他选项,我更新了上面的代码,这满足了编译器的要求。注意替换行

throw new IOError(e)

System.exit(0);

没有修复错误,因为据我所知,编译器无法在编译时判断程序是否会结束。有一种方法来抑制警告会很有帮助,因为我们知道在运行时程序将始终(或实际上总是)结束,但唉@SuppressWarnings 没有用。

【讨论】:

  • 这也行不通。您需要声明您的getImage() 方法可能会抛出Exception。所以public static Image getImage(String filepath, Class cl) throws IOException {。但是,这仅意味着您需要在代码中调用 getImage() 的另一个 try/catch
  • 如果在没有任何额外处理的情况下捕获并抛出异常,则根本不需要捕获它。这将给出:public static Image getImage(String filepath, Class cl) throws IOException { return ImageIO.read(cl.getResource(filepath)); }
  • 当一个方法抛出异常时,它基本上是在说“出了点问题,我不知道该怎么办;你来处理它!”所以调用该方法的代码现在必须处理这个问题。最终,您需要在代码中处理异常...
  • @Zephyr 是的——但在上述情况下也是如此——只有方法签名中的异常声明丢失了。它给出了编译时错误。应该是:public static Image getImage(String filepath, Class cl) throws IOException {...}。所以我的建议更短,但没有任何改变。
  • @Zephyr 我会说它不那么令人困惑,因为没有人想知道定义捕获的目的是什么。它没有额外的价值。
猜你喜欢
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2021-01-09
相关资源
最近更新 更多