如果可以为应该抛出已检查异常的方法写入字节代码?
例如,除非方法声明它抛出已检查的异常,否则以下Java类不会编译:
public class CheckedExceptionJava {
public Class<?> testChecked(String s) throws ClassNotFoundException {
return Class.forName(s);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然以下Scala等价物(因为Scala没有检查异常):
class CheckedException {
def testChecked( s : String ) = Class.forName( s )
}
Run Code Online (Sandbox Code Playgroud)
即使生成的字节码几乎相同:
Compiled from "CheckedExceptionJava.java"
public class CheckedExceptionJava extends java.lang.Object{
public CheckedExceptionJava();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public java.lang.Class testChecked(java.lang.String) throws java.lang.ClassNotFoundException;
Code:
0: aload_1
1: invokestatic #2; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
4: areturn
}
Compiled from "CheckedException.scala"
public class CheckedException extends java.lang.Object implements scala.ScalaObject{
public …Run Code Online (Sandbox Code Playgroud) 我正在为我的类编写一个测试用例,其中包含抛出异常的方法(包括checked和runtime).我已尝试过此链接中建议的不同可能的测试方法..看起来它们似乎只适用于运行时异常.对于Checked异常,我需要执行try/catch/assert,如下面的代码所示.有没有替代尝试/ catch /断言/.你会注意到testmethod2() and testmethod2_1()显示编译错误,但testmethod2_2()没有显示使用try/catch的编译错误.
class MyException extends Exception {
public MyException(String message){
super(message);
}
}
public class UsualStuff {
public void method1(int i) throws IllegalArgumentException{
if (i<0)
throw new IllegalArgumentException("value cannot be negative");
System.out.println("The positive value is " + i );
}
public void method2(int i) throws MyException {
if (i<10)
throw new MyException("value is less than 10");
System.out.println("The value is "+ i);
}
}
Run Code Online (Sandbox Code Playgroud)
测试类:
import static org.junit.Assert.*;
import org.junit.Before; …Run Code Online (Sandbox Code Playgroud) 在创建自定义异常时,如果我们想要创建一个已检查的 Exception,我们会扩展Exception类,对于未经检查的异常,我们会扩展RuntimeException类.我的问题是,当JVM全部是Exception类的子类时,JVM如何处理RuntimeException和Exception的子类.
java jvm exception-handling checked-exceptions unchecked-exception
我正在阅读有关Java中已检查和未检查的异常的文章,并找到此文章/链接:https : //projectlombok.org/disableCheckedExceptions.html
根据这篇文章,这只是为javac开发的一种hack。
考虑下面的代码片段:
import java.io.*;
class Example
{
public static void main(String args[]) throws IOException
{
FileInputStream fis = null;
fis = new FileInputStream("myfile.txt");
int k;
while(( k = fis.read() ) != -1)
{
System.out.print((char)k);
}
fis.close();
}
}
Run Code Online (Sandbox Code Playgroud)
在这里我必须写, public static void main(String args[]) throws IOException
因为我正在尝试打开文件。在这里,“ throws”子句是必须的。没有它,我会得到一个错误。如果我确定要打开的文件的存在怎么办。提到的位置中的iemyfile.txt。在某些时候,您可能会觉得代码不需要检查异常。
Java是否提供了根据需要禁用检查异常的功能?
即使做了很多研究,我也找不到合适的答案。
我正在为我的方法之一编写 Java 单元测试。方法声明是这样的:
public int convertToInteger() throws InvalidRomanNumberException
{
int result=0;
BaseRomanNumeral num1, num2;
int i=0;
if(!validOperation())
throw new InvalidRomanNumberException();
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试编写两个单元测试。一是测试是否抛出了正确的异常。另一种是确保写入转换发生。这就是我的测试用例的样子
@Test
public void testRomanNumberConversion() {
String romanValue="MCMII";
RomanNumber num=new RomanNumber(romanValue);
assertEquals(1903,num.convertToInteger());
}
@Test(expected = InvalidRomanNumberException.class)
public void testInvalidRomanNumberExceptionThrown() {
String romanValue="MCMIIII";
RomanNumber num=new RomanNumber(romanValue);
num.convertToInteger();
}
Run Code Online (Sandbox Code Playgroud)
对于这两个测试用例,我收到一个错误,指出 Unhandled InvalidRomanNumberException。仅当我向每个方法定义添加 throws InvalidRomanNumberException 时,此问题才能解决。但我认为这不是正确的方法。只是想和你们其他人确认一下,这里的标准是什么?我应该如何解决这个未处理的异常消息
Exception并且IOException都是编译时检查的异常.
但是,我们不能IOException在catch块中使用.但是我们可以Exception在catch块中使用它的原因是什么.
import java.io.*;
class Demo{
public static void main(String args[]){
try{
}catch(IOException e){ // Does not compile
}
try{
}catch(Exception e){ // Compile
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在这里有一个相当简单的IntelliJ /工具问题:
我正在处理一些遗留代码,并开始在这里和那里重做工作.我经常偶然发现的是在方法签名中声明(检查)异常,尽管这些异常永远不会抛出体内.
这些声明也不是由接口或类似的东西强制执行,因为这个问题主要发生在MVC控制器中,显然总是一遍又一遍地复制和粘贴.
我想知道是否有办法用IntelliJ搜索这些声明的异常.
因为如果我把我的插入符号放在throws关键字上它没有突出显示任何内容,因为声明的异常永远不会被抛出,但编辑器也没有向我显示错误标记,我真的很感激:)
IntelliJ中是否有一个选项可以启用这个功能还是存在可以完成这项工作的插件?
提前致谢.
当我们在 Java 中调用抛出异常的方法时,我们如何处理这个问题?
我的代码在 kotlin 中,我使用的是用 Java 编写的第 3 方库。我调用了这个库的一个方法,在某些情况下它会抛出一些自定义异常。现在 kotlin 不强制我处理这个异常,在这种情况下应用程序会崩溃。处理这个问题的最佳方法是什么?
可能重复:
何时选择已检查和未检查的异常
你好!
所以,关于何时抛出已检查或未经检查的异常,我仍然感到很自在.我想知道其他人认为在这种情况下最合适的东西:
class Correlation<T>
{
private final T object1, object2;
private final double correlationCoefficient;
public Correlation(T object1, T object2, double correlationCoefficient)
{
if(Math.abs(correlationCoefficient) > 1.0 || (object1.equals(object2) && correlationCoefficient != 1.0))
throw new IllegalArgumentException();
this.object1 = object1;
this.object2 = object2;
this.correlationCoefficient = correlationCoefficient;
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在这种情况下,我想抛出一个运行时异常,因为我无法从用户传入错误数据的情况中轻松恢复.我想事先指出我无法控制传入的数据.如果可以,我会创建一个接口,保证构造函数中的条件为真.但是,这是已经计算出的相关性的便利类,因此我必须相信用户正在提供准确的信息.
好的,让我知道你们的想法!
我有一个异常链,其中method1抛出一个异常method2抛出异常的异常main.由于某种原因,编译器强制我处理错误method2并将其标记为错误,如果我不这样做,表明它是一个已检查的异常.但是当相同的Exception内容向下抛出时main,编译器允许我忽略它并且不显示任何错误.
原来的Exception method1是a ParseException,经过检查.但是该方法throws Exception在头文件中有一个泛型子句,并且同一个对象被抛出到method2,它具有相同的throws Exception子句.此异常何时以及如何失去编译器检查/捕获的状态?
编辑澄清:
public void method1() throws Exception{
// code that may generate ParseException
}
public void method2() throws Exception{
method1(); //compiler error (if the throws clause is left out)
}
public static void main(String[] args){
method2(); //ignored by compiler, even though the exception isn't caught or thrown or handled at all
}
Run Code Online (Sandbox Code Playgroud)
编辑:
对不起大家,问题是基于一个错误...主要方法实际上有一个throws Exception我失踪的条款.我已删除它,代码现在表现如预期.感谢您的帮助!