質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

Javaでアプレットビューアを実行しても何も起こらない、最終的にはテキストの内容を表示したい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,978

score 90

症状

http://fantom1x.blog130.fc2.com/blog-entry-117.html[参考1](http://)
http://fantom1x.blog130.fc2.com/blog-entry-116.html[参考2](http://)
上記のサイトを参考にJavaでテキストを読み込みたかったのですがタイトルのようなエラーが出てしましました。アプレットなのでmainメソッドは必要ないと思うのですがどうすればよいのでしょうか?

ソース

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.applet.*;
import java.awt.*;
import java.io.*;
import java.lang.Object;
import java.net.URL;


public class HTTP extends Applet{
    String text;
    private static final String DEFAULT_ENCORDING = "UTF-8";  //デフォルトのエンコード
    private static final int DEFAULT_READ_LENGTH = 8192;      //一度に読み込むバッファサイズ

    //ストリームから読み込み、バイト配列で返す
    public static final byte[] readStream(InputStream inputStream, int readLength) throws IOException {
        final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(readLength);  //一時バッファのように使う
        final byte[] bytes = new byte[readLength];    //read() 毎に読み込むバッファ
        final BufferedInputStream bis = new BufferedInputStream(inputStream, readLength);

            try {
                int len = 0;
                while ((len = bis.read(bytes, 0, readLength)) > 0) {
                    byteStream.write(bytes, 0, len);    //ストリームバッファに溜め込む
                }
                return byteStream.toByteArray();    //byte[] に変換

            }
        finally {
                try {
                     byteStream.reset();     //すべてのデータを破棄
                    bis.close();            //ストリームを閉じる
                }
            catch (Exception e){
                System.out.println(e);
                }
           }
    }

    //ストリームから読み込み、テキストエンコードして返す
    public static final String loadText(InputStream inputStream, String charsetName) throws IOException, UnsupportedEncodingException {
        return new String(readStream(inputStream, DEFAULT_READ_LENGTH), charsetName);
    }
    public static final String loadTextURL(URL url) throws IOException {
            InputStream is = url.openStream();  //url.openConnection().getInputStream() と同じ
            return loadText(is, DEFAULT_ENCORDING);
    }

    //メインでは... (※例外処理は省略)
    public void init(){

        try {
            String fileName = "test3.txt";  //html からの相対パス
            text = loadTextURL(new URL(getCodeBase(), fileName));  //同サーバ上の場合
            System.out.println(text);
        }
        catch (IOException e){
            System.out.println(e);
            }
    }


    //↑では確認しずらいので、↓のメソッドなどで確認
    public void paint(Graphics g) {
        g.drawString(text, 5, 25);
    }
}

エラー内容

F:\>javac HTTP.java

F:\>java HTTP
エラー: メイン・メソッドがクラスHTTPで見つかりません。次のようにメイン・メソッドを定義してください。
public static void main(String[] args)
またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要があります

追記

すみません、実行のコマンドを間違えていました。しかしアプレットを実行しても何も表示されません。どうすればよいでしょうか?

実行時のコマンドプロンプトの状態

F:\>appletviewer HTTP
読込み中の入出力例外です: F:\HTTP (指定されたファイルが見つかりません。)

F:\>appletviewer HTTP.java

追記の追記

アプレットビューア実行後コマンドプロンプトに以下のようなエラーメッセージが表示されました。
F:\>appletviewer Test.html
java.io.FileNotFoundException: F:\res\data\sample.txt (指定されたパスが見つかり ません。)
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException: String is null
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2916)
at HTTP.paint(HTTP.java:76)
at sun.awt.RepaintArea.paintComponent(RepaintArea.java:264)
at sun.awt.RepaintArea.paint(RepaintArea.java:240)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:358)
at java.awt.Component.dispatchEventImpl(Component.java:4967)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4713)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

String is null とあるのでこれはテキストが見つかってないという事でいいのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

非推奨という点はmaisumakunさんがおっしゃるとおりですが、それはそれとして・・・

コード上にある問題は「initメソッドのローカル変数としてtextが定義されている」ことです。paintメソッドでアプレット上に描画しようとしているtextはフィールドですよね?そのフィールドの値はinitメソッドでファイルから読み込みその中身を設定したいはずです。しかしinitメソッドのローカル変数として設定されるだけでフィールドに値が設定されませんので、アプレットを実行したとき、paintメソッドでNPE(NullPointerException)が発生し、何も表示されないのだと思います。

=>対処:initメソッドからローカル変数textを削除してください。

ところでご質問からはどのようにアプレットビューワーを実行したかはっきりしないのですが、コードペース(HTMLが置いてある場所)からの相対パスres/data/sample.txtは存在するでしょうか?もしそれが適切な場所にないと前述の問題をクリアしたとしても「ファイルが見つからない」というエラーになると思います。


ちなみにアプレットは非推奨という以外に、デバッグしにくかったり実行が面倒という面があると思います。ブラウザー上で動く見込みがないにもかかわらずHTMLファイルをかかねばならない点も悲しい感じがしますしw;
個人的にはスタンドアロンアプリケーションとしてプログラムを作りjavaコマンドで実行したりIDEでデバッグ実行するようなアプローチをお勧めしたいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/18 11:16

    javac HTTP.javaでコンパイルし、appletviewer Test.htmlで指定した後にappletviewer HTTP.javaで実行という形でいいでしょうか?

    キャンセル

  • 2018/01/18 11:17

    すみません、最後の入りませんでしたね。

    キャンセル

  • 2018/01/18 11:23

    いえ、appletviewer Test.htmlのみです。
    ところでご自分で調べ(確認し)た上で不明な点を質問するのがQ&Aのベターな使い方だと思います。閲覧者側も「質問者さんが躓いている点」のみを端的にアドバイスするというスタンスのことが多いと思います。それなら少しの時間で行えますから。アドバイスではなく指導を乞うようなやりとりにならないように注意するとよいと思います。

    キャンセル

+1

本題ではありませんが、アプレットはJava 9で非推奨化されていますOracle)。

Oracleでは、Java Standard Edition Development Kit 9 (JDK 9)でJavaブラウザ・プラグインを非推奨としました。非推奨とは、このテクノロジの使用を停止するための開発者向けの警告です。JRE 9は引き続きJavaプラグインを提供し、標準プラグイン・サポートを継続して提供するブラウザでのアプレットの起動をサポートする予定ですが、制限付きの使用のみが可能であり、お薦めできません。このブラウザ・プラグインは、将来のJava SEリリースでOracle JDKおよびJREから削除されます。

新規でアプレットを作っても活躍の場はほぼ皆無ですし、既存のアプレットも別手段に移行すべき時期です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/17 23:19

    つまりソースをどのように変更すればいいのでしょうか?

    キャンセル

  • 2018/01/18 07:35

    まずは、何で作るかから考え直しましょう。

    キャンセル

0

追記の追記についてですか自分でパスを設定しなおして上手くいきました。F:にあるテキストを指定していなかったのが問題だったようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • Javaでアプレットビューアを実行しても何も起こらない、最終的にはテキストの内容を表示したい