非法状态异常是什么?

48

我正在尝试使用以下Fastload API

连接...等都完美无误。


我知道它失败的具体位置。

 ...........
 System.out.println(" Streaming " + dataFile);
 pstmtFld.setAsciiStream(1, dataStream, -1); // This line fails
 System.out.println("check the above line"); // This does not go to console
 ...........

异常是

Exception in thread "main" java.lang.IllegalStateException: Sample failed.

[ODBC Teradata Driver] Invalid precision: cbColDef value out of range


这是我正在尝试上传的表格。它是一个.csv格式,当我通过记事本打开它时,它看起来像这样

1,9,Win
2,9,Winc
3,9,Wi

我为什么会得到这个异常?我该如何改进它?据我理解,问题在于pstmtFld.setAsciiStream(1, dataStream, -1)不知何故无法接受数据集并抛出异常。


2
通常情况下,当我捕获到一些“不可能发生”的异常,并且没有其他更具描述性的异常类型可供抛出时,我会抛出一个 IllegalStateException。例如,假设我编写了用于显示图像的代码,而该图像具有负宽度-抛出任何其他异常都会更糟糕,因此我可以编写自己的未经检查的异常(建议实践,但您也可以考虑将其作为已检查的异常),或者使用内置的 IllegalStateException 异常。 - tucuxi
根据http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#setAsciiStream%28int,%20java.io.InputStream,%20int%29,文件长度(-1)可能会导致这种情况吗? - ioreskovic
4个回答

52
通常情况下,IllegalStateException 用于表示“在非法或不适当的时间调用了方法”。然而,这似乎并不是一个特别典型的用法。
您链接的代码显示它可以在该代码中的第259行抛出,但仅在向标准输出倾倒 SQLException 后才会发生。
仅凭那个异常,我们无法确定问题所在。更好的代码应该使用原始的SQLException作为“cause”异常(或者让原始异常向上传递)-但您应该能够在标准输出中看到更多详细信息。查看该信息,您应该能够看到导致异常的原因,并进行修复。

1
@BoratSagddiev:就像System.out - 它是您进程中标准输出流,通常会写入控制台(如果已连接),或在服务器端进程中通常被捕获为日志文件。由于我们不知道您如何运行代码,因此很难告诉您要查找的位置。 - Jon Skeet
我已经编辑了问题。我知道它失败的确切位置。pstmtFld.setAsciiStream(1, dataStream, -1);没有执行。 - Borat Sagddiev
@BoratSagddiev:这是它最初抛出SQLException的地方 - 在较低的位置被捕获、转储,然后抛出IllegalStateException。因此,您确实应该记录SQLException。 - Jon Skeet
1
@JonSkeet - 这是使用IllegalStateException的一个好例子还是坏例子?请指教。谢谢。顺便说一句,我不是这个问题的提问者,他只是个模仿者。我是真正的Borat。 - Erran Morad
1
@BoratSagdiyev:在我看来相当合理。 - Jon Skeet
显示剩余2条评论

22

IllegalStateException表示方法在错误的时间被调用。在下面的示例中,我们可以看到remove()方法正在循环遍历过程中改变元素(非法调用),这被Java捕获并抛出异常:

IllegalStateException表明方法在错误的时间被调用。在下面的示例中,我们可以看到remove()方法正在循环遍历过程中修改元素(非法调用),这被Java捕获并抛出:

package com.concepttimes.java;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class IllegalStateExceptionDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List al = new ArrayList();
        al.add("Sachin");
        al.add("Rahul");
        al.add("saurav");
        Iterator itr = al.iterator();  
        while (itr.hasNext()) {           
            itr.remove();
        }
    }
}
请参考下面的链接以获取更多详细信息。 http://www.elitmuszone.com/elitmus/illegalstateexception-in-java/

17
你错了!上面的回答实际上让我朝着解决代码中类似问题的正确方向前进了。你不应该仅仅因为它们参考了旧问题就给答案投反对票。这是最不恰当和令新的 SO 用户气馁的做法。 - Mario S
这实际上是一个适当使用IllegalStateException的很好的例子。我不得不仔细阅读它才看出来。@Nick需要提高他的阅读理解能力。 - oligofren

19

非法状态异常是一种未经检查的异常。

它表示方法在错误的时间被调用。

例如:

Thread t = new Thread();
t.start();
//
//
t.start();

输出:

Runtime Excpetion: IllegalThreadStateException

我们无法重新启动线程,否则会抛出IllegalStateException异常。


-2
public class UserNotFoundException extends Exception {
    public UserNotFoundException(String message) {
        super(message)

6
欢迎来到Stack Overflow!虽然这段代码或许可以解决问题,但是包含一个解释来说明它是如何解决问题的将会有助于提高你的帖子质量并可能获得更多的赞。记住,你的回答是为未来的读者而写的,而不仅仅是为了现在提问的人。请[编辑]你的回答以加入解释,并说明所涉及的限制和假设条件。 - Dharman
下降投票:代码似乎与所提出的问题完全无关,只有代码而没有解释其相关性。我怀疑这是Szymon的错误,这段代码是为另一个SO问题而设计的。 - Jason Crease

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接