人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JavaでLongを返して欲しいところをぬるぽを投げつけられました。
どうしたらガッってできますか??

ちなみに相手先のクラスは弄れないのでこっちでガッってする方法をお願いします。

●質問者: くいっぱ
●カテゴリ:コンピュータ
✍キーワード:Java ぬるぽ クラス
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● y@su
●16ポイント

http://www.google.co.jp/

Google

Longを取りたいクラスにgetメソッドを用意してLongを返すようにするしかないですね。

全く弄れないとなるとキャストしてLongに変換するなりするしか無いです。

◎質問者からの返答

getメソッドは既にあってそこにLongが入っているはずなんですが、入ってないのでぬるぽーーー!と言われます。 Javaはnullをキャストできるんですか??? (´0ω0`)??

なんかこう参照するまえに

if (hogehogeLong != null) {

System.out.println(hogehogeLong);

}

みたいな方法ってなんかなかとですか??


2 ● y@su
●16ポイント

http://www.google.co.jp2/

なるほど。

それだとLongを返すはずのクラスにバグがあるような気がするんですが・・・。

ソースを公開する事は出来ますか?

公開したら回答もしやすくなるので私が分かれば私が。ほかのはてなユーザーが回答してくれると思うんですけど。

◎質問者からの返答

そーすは、というかSDKはかぶろぼのやつです。

http://www.kaburobo.jp/indexpage.do

これの、

java.lang.Object

jp.kaburobo.information.BusinessPerformanceInformation

に、

long getIssuedAndOutstanding() 総株式数を返します。

っていうのがいるんですが、銘柄によってぬるえくせぷちぃおん返すやつがいるんですよね。多分データがないだけのような気もするんですが、そこで途切れちゃうので、無視するなりなんなりさせたいのですが・・・


3 ● upride
●16ポイント

http://google.co.jp/

Google

try ? catch ではだめとですか?

◎質問者からの返答

try 〜 catchでよかとですが、

今、大きくtry 〜 catchしてるんだけど、そこの読み込みのところだけ次善策としてtry 〜 catchをネストしてやればよかと?

記述サンプルがほしいので、参照URLがあったらうれしかった。


4 ● F57PB
●16ポイント

http://java.sun.com/

Java Technology

ご自身でもかかれていますが、最も単純なのは、


-------------------------------------------------

Long value = hoge.getLong();

if(value == null) {

/* nullの時の処理 */

}

-------------------------------------------------


と言うif分岐を入れることでしょうね。


問題は、nullの時の処理を何にするかです。


a.処理継続できないとしてエラーにする

b.何らかのデフォルト値を使う(nullの時は0と解釈する等)

等が一般的ですね。


また、そもそもそのメソッドがnullを返して来ること自体が

仕様上おかしい、と言う事であれば、作成元に修正を依頼するのが

最善の手段です。(可能かどうかは別ですが)


ちなみに、

> Javaはnullをキャストできるんですか?

できます。

以下は妥当ですし、エラーにもなりません。

------------------------------------------------

Object value = null;

Long longValue = (Long)value;

System.out.println(”longValue = ” + longValue);

------------------------------------------------


あと、私もプログラマなので余計な一言を。。。

この程度のことは自分で(上記のような)サンプルコードを書けば簡単に検証できます。

もし貴方が職業プログラマなのであれば、このくらいは自力で解決する

努力をしないといつまでたっても初心者止まりですよ。

◎質問者からの返答

ごめんなさい、眠かったんで寝ちゃいました。

今はこれでお金もらってるわけではないので趣味ぷろぐらまですw

お作法の問題だったので、知っている人に聞いたほうが早いかなと。

・・・。

Long value = hoge.getLong();

この行でぬるぽが帰ってくるってことは…。

中でエラートラップがされてないんですかね。

------------------------------------------------

Object value = null;

Long longValue = (Long)value;

System.out.println(”longValue = ” + longValue);

------------------------------------------------

これがエラーなしってのがなにか空恐ろしい気がするんですが、私だけですかね。なんだろ、0が入ってくるのかな…。

これはこれで気になる…。


5 ● F57PB
●16ポイント

http://www.tele.ucl.ac.be/PEOPLE/UMEDA/kaburobo2004/JavaDoc/jp/k...():detail]

> Long value = hoge.getLong();

> この行でぬるぽが帰ってくるってことは…。

> 中でエラートラップがされてないんですかね。

上記URLのメソッドの事ですね?

まず、戻り値はLong(クラス)ではなく、long(基本型)ですね。

基本型にはnullはあり得ないので、戻り値がnullなのではなく、

ご認識されているようにこのメソッドの中でNullPointerEx.が発生していますね。

(ただ、NullPointerEx.は一般的にはハンドリング(エラートラップ)しません。本来起こってはならないエラーなので、根本原因を解決すべきなんです。)


まず、どこで発生しているのかを特定するには、スタックトレースを見るのがセオリーです。

java.lang.NullPoinerException

at ..........(クラス名:ソースコードの行番号)

at ..........(クラス名:ソースコードの行番号)

と言うのが出ているはずですが、その一番上のatが発生元になります。

http://www.kpdus.com/jad.html

Home Page of Jad - the fast Java decompiler

次に、発生元がわかれば、なぜエラーになるのか、原因を調査するのですが、

ソースコードの該当個所を見て追跡すればわかります。


今回は、ソースコードが無いようですので、上記URLにあるJadで逆コンパイルして

ソースコードを生成し、該当個所を確認する手があります。

(解凍して、> jad -lnc BusinessPerformanceInformation.class で実行)


ソースコードを読んで、原因がわかればそれに対処します。

今回の場合、 BusinessPerformanceInformationクラスは単なるJavaビーンであり、

大したロジックを持っていないと思いますので、根本原因は別にありそうな予感がします。


となると、原因はさらにさかのぼって調査する羽目になり、そこまで手間かけてられないよ、

と言う事で、対処療法的に解決するのがベターなように思います。


対処療法としては、uprideさんが示されているように、try?catchで囲みます。

------------------------------------------------

long value = 0;

try {

value = hoge.getIssuedAndOutstanding();

}

catch(NullPointerException e) {

/* とりあえず、0として処理を継続する */

value = 0;

}

------------------------------------------------


ただし、このようにtry?catchを使うのは「やむを得ない場合」だけの

最後の手段であり、本来はNullPointerEx.の発生を回避するのが基本です。

http://www.hatena.ne.jp/1137000566#

人力検索はてな - JavaでLongを返して欲しいところをぬるぽを投げつけられました。 どうしたらガッってできますか?? ちなみに相手先のクラスは弄れないのでこっちでガッってする方法をお願..

>> ------------------------------------------------

>> Object value = null;

>> Long longValue = (Long)value;

>> System.out.println(”longValue = ” + longValue);

>> ------------------------------------------------

> これがエラーなしってのがなにか空恐ろしい気がするんですが、私だけですかね。

> なんだろ、0が入ってくるのかな…。これはこれで気になる…。

確かに恐ろしいですね。

実際、システム開発の現場でもNullPointerEx.は発生率ナンバーワンのエラーです。


この例では、valueにはnullが入っています。0も入っていません。

細かく説明しだすとJavaの言語仕様まで踏み込んでしまうので割愛しますが、


3行目を、

------------------------------------------------

System.out.println(”longValue = ” + longValue.toString());

------------------------------------------------

に変えると、NullPointerEx.になります。


なぜかと言うと、

・もとの例では、valueのメソッドを呼び出していない

・3行目を変えた例では、valueのメソッドを呼び出している

からです。

valueにはnullが入っているので、nullに対してメソッドを呼び出すのは不正なわけです。

◎質問者からの返答

お、回答ありがとうございます。

ちょうどここまですすんだところです。

おっしゃる通り呼び出し先でぬるっぽが起きていて、上にぬるぬるぬるとあがってきていました。どうも100銘柄のうち8銘柄だけ目的のデータが無いみたい。(´・ω・`)

(単純な原因なんですが… …データ故どうしたものか悩んでしまいます…)

今回は、ちょっと質問の仕方がよくなかったですね。

ぬるっぽ=ぬるぽいんたーえくちぇぴちぉーん〜のつもりだったんですが、なんかよくわからない質問になってしまいました。

手探りながらもお答えいただきました皆様ありがとうございます。

なんとなく分かっていても、「Java + NullPointerException」で検索して目的のエスケープ方法を探すのは結構しんどいです。Java本とかを順を追って読んでいけば自然とみにつくのかもしれませんが、Javaの勉強をしたかったわけでもないので、今回ははてなで質問させていただきました。そんな簡単なことを聞いてたら身につかないよというご意見もあるかもしれませんが、初心者には熟練者が持っているお作法的なカンというものがとても鈍いものです。しってりゃなんてことも無いことでも悩んでしまいます。またそれが悩む必要があるものなのかも知らなかったりするので、性質がわるいです。

というわけで教えてくんにもご理解をいただけましたら幸いです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ