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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

解決済

3回答

1194閲覧

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

aiueoaiueoaiue

総合スコア94

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

0グッド

1クリップ

投稿2018/01/17 12:33

編集2018/01/18 02:21

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

Java

1import java.io.IOException; 2import java.io.UnsupportedEncodingException; 3import java.nio.charset.Charset; 4import java.nio.charset.StandardCharsets; 5import org.apache.http.HttpStatus; 6import org.apache.http.client.ClientProtocolException; 7import org.apache.http.client.methods.CloseableHttpResponse; 8import org.apache.http.client.methods.HttpGet; 9import org.apache.http.impl.client.CloseableHttpClient; 10import org.apache.http.impl.client.HttpClients; 11import org.apache.http.util.EntityUtils; 12import java.applet.*; 13import java.awt.*; 14import java.io.*; 15import java.lang.Object; 16import java.net.URL; 17 18 19public class HTTP extends Applet{ 20 String text; 21 private static final String DEFAULT_ENCORDING = "UTF-8"; //デフォルトのエンコード 22 private static final int DEFAULT_READ_LENGTH = 8192; //一度に読み込むバッファサイズ 23 24 //ストリームから読み込み、バイト配列で返す 25 public static final byte[] readStream(InputStream inputStream, int readLength) throws IOException { 26 final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(readLength); //一時バッファのように使う 27 final byte[] bytes = new byte[readLength]; //read() 毎に読み込むバッファ 28 final BufferedInputStream bis = new BufferedInputStream(inputStream, readLength); 29 30 try { 31 int len = 0; 32 while ((len = bis.read(bytes, 0, readLength)) > 0) { 33 byteStream.write(bytes, 0, len); //ストリームバッファに溜め込む 34 } 35 return byteStream.toByteArray(); //byte[] に変換 36 37 } 38 finally { 39 try { 40 byteStream.reset(); //すべてのデータを破棄 41 bis.close(); //ストリームを閉じる 42 } 43 catch (Exception e){ 44 System.out.println(e); 45 } 46 } 47 } 48 49 //ストリームから読み込み、テキストエンコードして返す 50 public static final String loadText(InputStream inputStream, String charsetName) throws IOException, UnsupportedEncodingException { 51 return new String(readStream(inputStream, DEFAULT_READ_LENGTH), charsetName); 52 } 53 public static final String loadTextURL(URL url) throws IOException { 54 InputStream is = url.openStream(); //url.openConnection().getInputStream() と同じ 55 return loadText(is, DEFAULT_ENCORDING); 56 } 57 58 //メインでは... (※例外処理は省略) 59 public void init(){ 60 61 try { 62 String fileName = "test3.txt"; //html からの相対パス 63 text = loadTextURL(new URL(getCodeBase(), fileName)); //同サーバ上の場合 64 System.out.println(text); 65 } 66 catch (IOException e){ 67 System.out.println(e); 68 } 69 } 70 71 72 //↑では確認しずらいので、↓のメソッドなどで確認 73 public void paint(Graphics g) { 74 g.drawString(text, 5, 25); 75 } 76}

#エラー内容
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 とあるのでこれはテキストが見つかってないという事でいいのでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

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


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

投稿2018/01/17 15:12

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiueoaiueoaiue

2018/01/18 01:40

申し訳ありません。実行方法は appletviewer HTTP.javaで実行しました。相対パスについては完全に失念していました。しかし実行してもファイルが見つからないというエラーすら表示されませんでした。ソースを張り替えておきます。
KSwordOfHaste

2018/01/18 02:03

自分の回答に「HTMLファイルをかかねばならない」と書きましたがそれは「appletviewerを動かす際にはHTMLを記述し、そのHTMLファイルを指定しなくてはならない」ということだったのです。 appletviewer Test.html と記述してTest.htmlの中にappletタグなどを含めないといけなのです。appletタグの書き方について調べHTMLを記述してください。ちなみにIntelliJのようなIDEだとアプレットクラスを定義してそのままデバッグ実行するとHTMLを自動生成しappletviewerを起動してくれたりします。もはやアプレットを書く人は殆どいないと思うのであまり目立つ機能ではないですが互換性のためか今でも残ってはいます。
aiueoaiueoaiue

2018/01/18 02:16

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

2018/01/18 02:17

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

2018/01/18 02:23

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

0

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

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

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

投稿2018/01/17 12:52

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiueoaiueoaiue

2018/01/17 14:19

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

2018/01/17 22:35

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

0

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

投稿2018/01/18 02:24

aiueoaiueoaiue

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問