• ベストアンサー

「初心者です」-Xlint: deprecation

import java.awt.*; import java.applet.*; public class ani_ball extends Applet implements Runnable { Thread th_mvball = null; int X,Y; double x1,y1; double x2,y2; double dx,dy; Graphics g; public void init() { this.setBackground(new Color(150,245,255)); this.X = 250; this.Y = 250; this.setSize(X,Y); this.x1 = this.x2 = this.X/2; this.y1 = this.y2 = this.Y/2; this.dx = 3; this.dy = 2; } public void paint(Graphics g) { g.setColor(Color.red); g.fillOval((int)(this.x2-3),(int)(this.y2-3),6,6); this.x1 = this.x2; this.y1 = this.y2; } public void start() { if(th_mvball == null) { th_mvball = new Thread(this); th_mvball.start(); } } public void run() { while(true) { try { this.move(); this.repaint(); Thread.sleep(10); } catch(InterruptedException e ) { this.stop(); } } } public void move() { if( y2 > Y ) { y2 = 2*Y - y1 - dy; dy = -dy; } else if ( y2 < 0) { y2 = -y1 - dy; dy = -dy; } else if ( x2 > X) { x2 = 2*X - x1 -dx; dx = -dx; } else if ( x2 < 0) { x2 = -x1 - dx; dx = -dx; } if( x2 < 0 ) { x2 = -x2 ; dx = -dx; } else if ( y2 < 0) { y2 = -y2; dy = -dy; } else if ( x2 > X) { x2 = 2*X - x2; dx = -dx; } else if ( y2 > Y) { y2 = 2*Y - y2; dy = -dy; } x2 = x1 + dx; y2 = y1 + dy; } public void stop() { if(th_mvball!=null) { th_mvball stop(); th_mvball=null; } } } ↑のプログラムをコンパイルすると、「-Xlint: deprecation オプションを指定して再コンパイルしてください」とエラーが出ます。 エラーの対処法、またはプログラムの訂正すべき箇所を教えてください。 よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • neko_noko
  • ベストアンサー率45% (146/319)
回答No.2

>ためしに実行してみると、 java ani_ball というように実行してませんか? これは「Javaアプリケーション」の場合の実行方法であり、 アプレットの場合はHTMLファイルを作ってブラウザから実行する必要があります。 http://www.hellohiro.com/applet.htm ついでに、コンパイル時の警告についてですが、 これはsystem0001さんのおっしゃるとおりです。 基本的に、この手のエラーが出るメソッドは、以前のバージョンでは フツーに使っていたけど、バージョンが変わったことで「推奨されなく」なったものです。 なんで推奨されなくなったかと言うと、 ・このメソッドより便利なメソッドを作った ・このメソッドに重大なバグがあって、使い方を間違えるとキケンなことが分かった ・その他。Sunの陰謀か(ウソです) などさまざまあります。 理由はともかく、少なくとも言えるのは、 「バージョンが上がればいずれこのメソッドは使えなくなる(かもしれない)ので、 今のうちに別の手を考えといてください」 ということです。

stealther
質問者

お礼

ありがとうございます。 はぃ、確かにご指摘のように実行していました。 お礼を書いてから、「あぁ、バカだ...orz」と思いました。

その他の回答 (2)

noname#49664
noname#49664
回答No.3

>java.lang.Threadのstop()は推奨されません Java SE のAPIでメソッドを確認してみましょう。 http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html stopは、「推奨されません」となっていますね。 stop,suspend,resumeといったスレッドを停止再開させる類のメソッドは、デッドロックの危険があるため非推奨になっています。現在、スレッドを停止するのにstopを使うことはまずありません。どうするかというと、終了フラグの変数を用意しておき、 while(フラグ変数){・・・スレッド処理・・・} というようにして、抜けたいときにはフラグ変数をfalseにしてrunを抜け出すようにします。これでスレッドは安全に終了します。

stealther
質問者

お礼

ありがとうございました。 直してみたら、ちゃんとエラーが出なくてコンパイルできました。

回答No.1

こんばんは! これは、確か・・・ 推奨されないクラスやメンバを使用していたり、オーバーライドしている時に 出る警告ですよ! -deprecationオプションを付加してコンパイルすると、 どのメソッドが推奨されていないか出るみたいです。 警告が出ても、実行できますよ! 試してみてください。

stealther
質問者

お礼

おっしゃるとおりのコンパイル方法だと、 java.lang.Threadのstop()は推奨されません と出ます。 ためしに実行してみると、 Exception in thread "main" java.lang.NoSuchMethodError: main と出て、実行できません。 どうしたらいいでしょうか。

関連するQ&A

  • マウスクリックで別のスレッドを動かしたい

    うまく動きません、どなたかご教示下さい(文字数が不足です) ===== public class ImgMove3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th1 /*, th2*/ ; private boolean bLoopEnd = false ; private int x1 = 30 , y1 = 100 ; // private int x2 = 80 , y2 = 150 ; Image img1 , img2 ; AudioClip sound ; private int vx1 = 3 , vy1 = 2 ; // private int vx2 = 1 , vy2 = 1 ; Dimension d ; public void init() { d = getSize() ; width = d.width ; height = d.height ; this.addMouseListener(this) ; this.addMouseListener(new MyImage3(this)) ; img1 = getImage( getDocumentBase() , "ambulance.jpg" ) ; img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; sound = getAudioClip( getDocumentBase() , "UFO.wav" ) ; } public void mouseEntered( MouseEvent e) { sound.play() ; } public void mouseClicked(MouseEvent e) { } public void start() { if(th1 == null) { th1 = new Thread(this); th1.start(); } } public void stop() { if( th1 != null ) { th1 = null ; } } public void run() { while(bLoopEnd == false) { move() ; repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x1 >= width - 130 ) { vx1 =- vx1 ; } if( y1 >= height - 110 ) { vy1 =- vy1 ; } if( x1 < 0 ) { vx1 =- vx1 ; } if( y1 < 0 ) { vy1 =- vy1 ; } } public void update( Graphics g1 ) { paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img1 , x1 , y1 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e){ } } //======================================================================= class MyImage3 extends Applet implements Runnable , MouseListener { private int width , height ; private Thread th2 ; private boolean bLoopEnd = false ; private int x2 = 80 , y2 = 150 ; Image img2 ; AudioClip sound ; private int vx2 = 1 , vy2 = 1 ; Dimension d ; Image firecar ; ImgMove3 imv3 ; public MyImage3(ImgMove3 app) { imv3 = app ; imv3.img2 = getImage( getDocumentBase() , "firecar.jpg" ) ; } public void mouseEntered( MouseEvent e) { imv3.sound.play() ; } public void mouseClicked(MouseEvent e) { Graphics g1 =getGraphics(); g1.drawImage( img2 , x2 , y2 , this ) ; imv3.repaint(); } public void start() { if(th2 == null) { th2 = new Thread(this); th2.start(); } } public void stop() { if( th2 != null ) { th2 = null ; } } public void run() { while( th2 != null && bLoopEnd == false) { move() ; imv3.repaint() ; try{ Thread.sleep( 10 ) ; } catch (InterruptedException e ) {} } } private void move() { if( x2 >= width - 130 ) { vx2 =- vx2 ; } if( y2 >= height - 110 ) { vy2 =- vy2 ; } if( x2 < 0 ) { vx2 =- vx2 ; } if( y2 < 0 ) { vy2 =- vy2 ; } x2 += vx2 ; y2 += vy2 ; } public void update( Graphics g1 ) { imv3.paint( g1 ) ; } public void paint( Graphics g1 ) { g1.drawImage( img2 , x2 , y2 , this ) ; } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }

    • ベストアンサー
    • Java
  • エラーも無いのにボールが動きません

     JAVA初心者です、宜しくお願いします。  今晩は、以下のようなコードを書いてやりましたが、動きません。  何故でしょう、特にエラーははいていません。  原因が分かりません、宜しくお願いします。 =============================================================== public class Ball_1 extends Applet implements Runnable { Thread thr = null; Color BGcolor; int appWidth; int appHeight; int x; int vel; public void inti() { BGcolor = Color.white; appWidth = 400; appHeight = 400; x = 30; vel = 20; } public void paint(Graphics g) { g.setColor(BGcolor); g.fillRect(0,0,appWidth,appHeight); g.setColor(Color.blue); g.fillOval(x,20,100,100); } public void start() { if(thr == null) { thr = new Thread(this); thr.start(); } } public void stop() { if(thr != null) { thr.stop(); thr = null; } } public void run() { while(true) { x = x + vel; if(x > appWidth) { x = x - appWidth; } repaint(); try { thr.sleep(50); } catch(InterruptedException e) { thr.stop(); } } } }

    • ベストアンサー
    • Java
  • セグメンテーション違反

    穴掘り方というやり方で迷路を作っています。 とりあえずすこしだけ作ってみて実行したらセグメンテーション違反が起こってしまいました。 解説お願いします。 次のサイトを参考にしています。ttp://www.ced.is.utsunomiya-u.ac.jp/lecture/2009/prog/p3/kadai4/5.html #include<stdio.h> #include<stdlib.h> #include<time.h> #define A 51 #define B 51 /*51ラ51マスの迷路*/ void initialize(int *x,int *y,int map[A][B]);  /*最初のステージ作成と座標決定*/ int dig(int *x,int *y,int map[A][B]);   /*道を作る*/ int main(void) { int x,y;   /*現在の座標*/ int map[A][B];    initialize(&x,&y,map); dig(&x,&y,map); map[1][0] = 2; map[A-2][B-1] = 2; for(y=0;y<B;y++){ for(x=0;x<A;x++){ if( map[x][y] == 0){ printf(" "); }else if( map[x][y] == 1){ printf("■"); }else if( map[x][y] == 2){ printf("..") ; } } printf("\n"); } } void initialize(int *x,int *y,int map[A][B]) { int i,h; for(i=0;i<A;i++){ for(h=0;h<B;i++){ map[i][h]=1; } } do{ *x=rand()%A; *y=rand()%B; }while(*x!=0 && *x!=A-1 && *y!=0 && *y!=B-1); } int dig(int *x,int *y,int map[A][B]) { int r,c,dx,dy,count=0; do{ r = rand()%4; switch(r){     /*道を進める方向を決める*/ case 0: dx = 0; dy = -1; break; case 1: dx = -1; dy = 0; break; case 2: dx = 0; dy = 1; break; case 3: dx = 1; dy = 0; break;    } if(*x+dx*2 <= 0 || *y+dy*2 <= 0 || *x+dx*2 >= A-1 || *y+dy*2 >= B-1 || map[*x+dx*2][*y+dy*2] == 0){ c = 0; count++; if(count ==4){     /*4方向とも進めなかったらループを抜ける*/ break; } }else if(map[*x+dx*2][*y+dy*2] == 1){ map[*x+dx][*y+dy] = 0; *x = *x + dx*2; *y = *y + dy*2; c =1; } }while(c==0); }

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • プログラミングProcessing ピンポンゲーム

    Processingでピンポンゲームを作っています。作成したプログラムは void setup(){ size(400,300); } float x=10; float y=10; float dx=1; float dy=2; int count=0; float r_w=50.0; float a_w=15.0; float a_h=15.0; boolean checkHit(float x,float y){ if(y+a_h<250)return false; if(x+a_w>=mouseX&&x<=mouseX+r_w){ return true; }else{ return false; } } void draw(){ x=x+dx;y=y+dy; if(x+a_w>=400){ dx=-1; }else if(x<0){ dx=1; } if(y+a_w>300){ x=0; y=0; dx=1; dy=2; count=0; }else if(y<0){ dy=2; } background(0,0,128); rect(x,y,a_w,a_w); rect(mouseX,250,r_w,3); text(count,10,300); if(checkHit(x,y)){ dy=-2; count=count+1; } } このプログラムだとどうしてもラケットの下にボールが潜り込んだ時に ボールが跳ね返されてしまうバグが発生してしまいます。 問題はboolean checkHitの部分にあると思うのですが、 どのように調節すればよいか分かりません。 わかる方教えてください<(__)>

  • 初心者です。

    javaのソースについて質問です。 次のソースに関していくつか質問させて下さい。 public class HelloThread implements Runnable { //処理1 Thread th; int pause; public static void main(String args[]) { HelloThread hello; //処理2 hello = new HelloThread(); hello.start(); //処理3 try{ Thread.sleep(1000); } catch (Exception ex) { } //処理4 hello.stop(); } public HelloThread() { } public void start() { //処理5 th = new Thread(this); th.start(); } public void run() { //処理6 while(th != null) { System.out.println("Hello World!"); try { Thread.sleep(200); } catch (Exception ex) { } } } public void stop() { //処理7 th = null; } } 質問 (1)mainメソッドのhello = new HelloThread();で HelloThreadクラスの処理1の2行が実行されると 思いますが、その後にhello.start();が実行される のでしょうか? (2)hello.start();で処理5が実行されるのでしょうか? (3)th.start();でrun()が呼び出されるのでしょうか? (4)処理6を実行している間、処理3、4が実行される のでしょうか? 出来ればその理由も教えて下さい。 (5)このソースの処理4の後のpublic HelloThread()は 何か意味があるのでしょうか? 以上、初心的な質問だと思いますが、よろしくお願いします。

    • ベストアンサー
    • Java
  • 落下する正方形を左右に移動するプログラム

    Javaについての質問です。 正方形を250ミリ秒ごとに5ずつ落下させ、その正方形をボタンで左右に移動できるアップレットを作りたいのですが、 落下はするけど左右に移動しません。改善点が分からないのでアドバイスをお願いします。 また、正方形がアップレットの外に出ないようにし、正方形が下に来た後はボタンを押しても左右に移動しないようにしてください。 また、プログラムはスレッドを定義するものと実行するものの2つあります。 //スレッドを定義する import java.awt.*; class MovingRect extends Thread{ Component component; volatile boolean runFlag = false; //制御用のフラグ volatile int interval; //時間間隔 int x, y; //正方形の始点の位置 //コンストラクタ MovingRect(Component c, int t, int x0, int y0){ runFlag = true; component = c; interval = t; x = x0; y = y0; } public void run(){ //このコンポーネントの境界を表す Rectangle r1 = component.getBounds(); //正方形を5ずつ落下させる //正方形が下に来たら、動きを止める for(; y < r1.height - 20; y += 5){ component.repaint(); try{ Thread.sleep(interval); } catch(InterruptedException e){} if(!runFlag) break; } runFlag = false; component.repaint(); } public void drawFrame(Graphics g){ g.fillRect(x, y, 20, 20); } public void end(){ runFlag = false; } } -------------------------------------------------------------------------- //スレッドを実行するアップレット import java.awt.*; import java.applet.*; import java.awt.event.*; public class MovingRectApp extends Applet implements ActionListener{ MovingRect thread1 = null; Button left, right; int i = 60; //iは正方形の始点のx座標、初期値は60 public void init(){ left = new Button("left"); left.addActionListener(this); add(left); right = new Button("right"); right.addActionListener(this); add(right); } public void actionPerformed(ActionEvent e){ //正方形が左端から出ないようにする if(e.getSource() == left){ i = Math.max(i - 20, 0); } //正方形が右端から出ないようにする else if(e.getSource() == right){ i = Math.min(i + 20, 200); } repaint(); } public void paint(Graphics g){ if(thread1 != null) thread1.drawFrame(g); } public void start(){ //時間間隔は250ミリ秒 thread1 = new MovingRect(this, 250, i, 40); thread1.start(); } public void stop(){ thread1.end(); thread1 = null; } }

    • ベストアンサー
    • Java
  • 初心者です 三角形を描きます

    class Triangle { Paint pat; int xpoints0, ypoints0, xpoints1, ypoints1, xpoints2, ypoints2; public Triangle(Paint p, int x0, int y0, int x1, int y1, int x2, int y2) { pat = p; xpoints0 = x0; ypoints0 = y0; xpoints1 = x1; ypoints1 = y1; xpoints2 = x2; ypoints2 = y2; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillTriangle( ); } } ここまでは書けたのですが、一番最後の g.fillTriangle( ); で、( )に何を書いたらいいのかが、分かりません。 教えてください!お願いします。

    • ベストアンサー
    • Java
  • Java applet

    Java appletを使用する課題なのですが、 途中まで書いて、それから止まってしまっています。 アドバイスなど頂ければ嬉しいです。 課題は、 (1)右から左へ動く文字列左から右へ動く文字列とを表示 (2)文字列が消えたらまた出てくるようにする (3)マウスのクリックボタンを押すと止まり、離すと動きだすようにする (2)まで考えたプログラム(コンパイル、実行済)を以下に載せます。 import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class SasakiYui extends Applet implements Runnable{ Thread th = null; Graphics g; int x; public void init(){ setBackground(Color.white); } public void start(){ if(th == null){ th = new Thread(this); th.start(); } } public void run(){ while(!Thread.interrupted()){ for(x=600;x>-300;x=x-5){ repaint(); try{ Thread.sleep(50); } catch(InterruptedException e){} } } } public void paint(Graphics g){ g.drawString("Happy Brithday!",x,10); g.drawString("Happy Birthday!",600-x,40); } } (3)ができるようにするには、 addMouseListener(new Mouseadapter(){ public void mousePressed(MouseEvent e){……} を使用するのだろうとは思うのですが、 ・これを組み込むのはpublic void init(){の後で良いか ・……の部分に何を書けばいいのか の2点がわかりません; よろしければ、アドバイスお願い致します!

    • ベストアンサー
    • Java
  • javaについて質問です。

    import javax.swing.*; import java.awt.*; import java.awt.event.*; class MoveField extends JPanel {       private int xc;       private int yc;       int d = 50;       Color c=Color.red;       int pause =1000;       boolean cont=true; thread th;       MoveField(){}       MoveField(int d){this.d=d;}       MoveField(int d,Color c){this(d);this.c=c;}       boolean isHit(int x,int y){             int w=(x-xc)*(x-xy)+(y-yc)*(y-yc);             if(w<=d*d){return true;}       return false; }       void start(){             cont=true; th= new Thread(this);             th.start(); } void stop() {cont=false:} public void run(){ when(cont){ int x=0 int y=0 if(Math.random()<0.5){x=(int)(Math.random()*(getWidth()-d));} if(Math.random()<0.5){y=(int)(Math.random()*(getHeight()=d));} xc=x; xy=y; repaint(); try{Thread.sleep(pause);}catch(Exception e){} } } @Override public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,getWidth(),getHeight()); gsetColor(c); g.fillOval(xc,yc,d,d); } } class MoveHit extends JFrame impkements ActionListener{ MoveField field; JTextField txt; nt pt=0; MoveHit(){ setDefaultCloseOperation(EXIT_ON_CLOSE); field=new MoveField(); add(field); JPanel p=new JPanel(); p.add(new Jlabel("Point")); txt=new JTextField(20); p.add(txt); add(p.BorderLayout.NORTH); p=new JPanel() JButton b; b=new JBotton("Start");b.addActionListener(this);p.add(b); b=new JBotton("Stop");b.addActionListener(this);p.add(b); add(p, BorderLayout.SOUTH); }   @Override public void actionPerformed(ActionEvent ev){ string cmd=ev.getActionCommand(); if(cmd.epuals("Stop")){ pt=0; txt.setText(""); Field.start(); } elese if(cmd.equals("Stop"))field.stop(); } public void mouseClicked(MouseEvent ev){ int x=ev.getX(); int y=ev.getY(); if(field.isHit(x,y)){ pt++; Toolkit.getDefaultToolkit().beep(); txt.setText(""+pt); } } public void mousePressed(MouseEvent ev){} public void mouseReleased(Mousevent ev){} public void mouseEntered(MouseEvent ev){} public void mouseExited(MouseEvent ev){} public static void main(String [] args){ MoveHit tx=new MOveHit(); tx.setSize(600,500); tx.setVisible(true); } } このプログラムがうまく作動しません。 エラーは 1.MoveHit.java:30: ';' がありません。 void stop() {cont = false:} 2.MoveHit.java:33: ';' がありません。 when(cont){ 3.MoveHit.java:46: 注釈は -source 1.4 でサポートされていません (注釈を使用可能にするには、-source 1.5 を試してください) @Override 4.MoveHit.java:55: '{' がありません。 class MoveHit extends JFrame impkements ActionListener { です。 また、MoveHitクラスがマウスイベントの処理に対応していないらしいので改善したいです。 ほかに修正点があれば教えてほしいです。協力お願いします。

専門家に質問してみよう