2013-06-13 2 views
9

Intellijが例外を解除する方法については、多くの質問があります。私は別の何かをしようとしています:ブレークポイントで例外をスローしたいので、そのコードで例外が発生した場合に何が起こるかを知ることができます。Intellijでは、どのようにしてブレークポイントで例外をスローできますか?

私はこれを強制する方法を考え出しました。たとえば、willBeUsedという変数がある場合は、ブレークポイントにヒットし、willBeUsed = nullというウォッチを追加できます。これによりNullPointerExceptionが発生します最終的にはです。

しかし、私はIOExceptionを送信して何が起こるかを確認したいという状況にあります。私のコードを騙してそのことをする方法はありません。 throw new IOException()という時計を追加すると、「予期しないトークン」というエラーが表示されます。

回避策として、例外をスローして再デプロイするようにコードを変更できます。しかし、私はソースコードを変更せずにデバッガでこれを行う方法があるのだろうかと思います。例えば、ifブロックでthrow文を置く、とだけ条件を変更:

boolean shouldThrowException = false; 
// .... 
if (shouldThrowException) //place breakpoint here 
{ 
    throw new IOException(); 
} 

をについてあなたは、ブレークポイントにヒットどう

+3

可能です。私は、この種のテストをより容易にする別の設計を検討することをお勧めします。例えば、[依存性注入](http://en.wikipedia.org/wiki/Dependency_injection)。 –

+1

@RobI依存性注入が良いです。私はそれが私にどのように役立つのか分かりません。あなたは精緻化できますか? –

+0

短いアイデア:時には例外を発生させるコードブロック(たとえば、 'do()'メソッドで 'IODoer'と言っていることをやるためのインターフェースを作ってください。あなたの本当の実装は全ての実際のコードを持つ一つの具象クラス 'IODoerImpl'にありますが、' do() 'メソッドを呼び出すたびに例外を発生させる別の具体的なクラス' TestIODoer'を持っています。いつも...あなたのプログラムは実際の実装を使用しますが、テスト中に代わりにこのテストクラスを注入することができます。 –

答えて

6

、trueにshouldThrowExceptionの値を変更します。

+0

私はかなり私の質問の回避策としてこれを与えました。しかし、それが唯一の方法ならば、それが唯一の方法だと思います。 –

+0

申し訳ありませんが、私はあなたの質問でそれを見逃している必要があります、あまりにも役に立たないことを申し訳ありません。 – MByD

1

これはどのように行うことができません。私は2つのアプローチを試みました(おそらく私のアイデアはいくつかの他のアイデアにつながるでしょう)

1)私はデバッガの "ログ評価式"をthrow new IOException()にしようとしましたが、IDEAが式。

2)また、ブレークポイントを設定しようとしましたが、停止したときに「式の評価」ダイアログを開いて新しい例外をスローしましたが、どちらも機能しませんでした。

デバッガが例外をスローすることはできません。 @ Binyaminの解決策はうまくいくが、あなたはすでにあなたの質問にそれを言及している。 IDEAでは、「サスペンド」チェックボックスをオフにし、「ログ評価式」ボックスにshouldThrowException = trueと入力することができます。これにより、デバッガは値を変更(およびログ)しますが、多くの同時スレッドを持つコードでは重大ではありません。

1

これを試してもわかりませんが、IOExceptionをスローする静的メソッドを作成してから、Evaluate Expressionを発行してそのメソッドを呼び出すことができます。

簡単なコード例:

enter image description here

Evaluate Expression...ウィンドウを起動し、throwExceptionメソッドを呼び出す(評価)し、その後、あなたされます:System.out.println行にブレークポイントを設定し

package com.stackoverflow; 

import java.io.IOException; 

public class Main { 
    public static void main(String[] args) { 

     doStuff(); 
    } 

    private static void throwException() throws IOException { 
     throw new IOException(); 
    } 

    private static void doStuff() { 
     System.out.println("doStuff"); 
    } 
} 

スタックトレースを取得するdoStuff

enter image description here

例外はもちろんthrowExceptionにありますが、コールスタック全体も表示されます。

+0

うん、それは働くだろう。しかし、私はまだ再展開する必要があります。しかし、これは図書館に入れておけば、どんなプロジェクトでも必要なときにいつでも呼び出すことができます。このようにして、メインプロジェクトのソースファイルを変更したり、再デプロイする必要はありません。私はmavenスコープを使用することができますので、私はパッケージ化すると展開されません。 –

+0

@tieTYTはい、まさに私の考えでした。 – maba

+0

これを試しましたが、コンソールの出力に例外が表示されません。私はそれが独自のインスタンスで例外を評価するので、メインスレッドには影響しないと思います。 –

1

JVM HotSwappingを利用する別の方法があります。

コードを一部のサーバーに配備しているとします。次に、アプリケーションを起動するときに、リモートデバッグをオンにすることを確認してください(デバッグしているので、展開について話していると思います)。それ以外の場合は、ローカルデバッガで正常に動作します。

ここでは、メインとその他の2つのクラスがあります。


package com.stackoverflow; 

import java.io.File; 
import java.io.IOException; 

public class Other { 
    public static void otherStuff() throws IOException { 
     File file = new File("Some_File.txt"); 
     file.createNewFile(); 
    } 
} 

throwException()

package com.stackoverflow; 

import java.io.IOException; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     doStuff(); 
    } 

    private static void doStuff() throws IOException { 
     System.out.println("doStuff"); 
     Other.otherStuff(); 
    } 

    public static void throwException() throws IOException { 
     throw new IOException(); 
    } 
} 

は、例えば、いくつかのutilのクラスでは、限り、それは "グローバル" 利用可能になるとどこにでも配置することができます。今は便宜のためにMainクラスに配置されています。

doStuff()メソッドでブレークポイントを設定することができます。そこで、固定throwException()メソッドを呼び出すようにotherStuff()メソッドのコードを変更することができます。

public static void otherStuff() throws IOException { 
    Main.throwException(); 
    File file = new File("Some_File.txt"); 
    file.createNewFile(); 
} 

私たちは、そうでない場合、我々はUnreachable statementとの誤差がありますので、いくつかの方法の代わりに、throw new IOException()を呼び出すを呼び出す必要があります。

その後、我々は他のクラスを再コンパイルするはCtrl +Shiftキー + F9を押すことができます。これでHotSwappedになります(実際にこれを行うかどうかを確認するダイアログが表示されます)。

次に、[続行]を押すと、例外がスローされます。

コードを元の状態に戻すことができます。

これは良いことは、再コンパイルされたクラスがリモートマシンに "ワイヤーで"ホットスワップされることです。

重要なことは、再コンパイルするコードが別のクラスにあることです。ブレークポイントを持っているクラスと同じクラスは、正しく読み込まれません。

回避策として、例外をスローして再デプロイするようにコードを変更できます。しかし、私はソースコードを変更せずにデバッガでこれを行う方法があるのだろうかと思います。

コードを修正しますが、デバッガではその時点で修正します。その後、小さな変更を元に戻して再コンパイルして、古いコードをホットスワップバックすることができます。

私はあなたがアイデアを得ることを望みます。

必要に応じてスクリーンショットを追加できます。

+1

それでも問題はありません。私の経験では、HotSwappingは30%の時間のように動作しますが、これは問題ありません。ありがとう –

+1

@tieTYTそれはあなたの時間の30%以上あなたのために動作することを願っています。私は今アイデアから外れています、これは私が思いつくことができる最高のものでした:-) – maba

1

コードを変更せずに(2018.1まで)利用できないと思います。

JetBrainsの問題は、IDEA-148408です。この機能をIntelliJ IDEAに追加することが要求されています。

UPDATE:2018.1バージョンので、それはそれはあなたが求めているものを行う方法があることをそうだ

関連する問題