🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

2820閲覧

javaで、static変数を使い、あるクラス中の配列を別のクラスでも扱いたいがうまくいかない。

onoko

総合スコア41

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/01/08 05:11

編集2021/01/08 05:38
``````java ```ここに言語を入力 コード ```コード ```### 前提・実現したいこと ここに質問の内容を詳しく書いてください。 (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが発生しました。 ### 発生している問題・エラーメッセージ javaを使った帳票出力のアプリです。 mainクラスでデータベースから読み込んだ商品別配送先の一覧表を、printクラスで配送先別送付商品に組み替えて、その帳票出力をします。商品別配送先の二次元配列をmainクラスからprintクラスへわたすにのに、static変数を使って行おうとしています。配列の縦横はそのときによって不定なので、staticな配列の宣言にnullを入れたところ次のようなエラーメッセージが出て通りませんでした。 うまくクラス間で配列の受け渡しができる方法を教えてください。引数で処理しようともしましたが、インターフェイスのPrintableの存在が障害になり成功しませんでした。

エラーメッセージ
The field item cannot be declared static in a non-static inner type, unless initialized ith a constant expression.

該当のソースコードこに言語名を入力

java
ソースコード

import static java.awt.Font.*; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; public class DataPrintable implements Printable{ public class Klass{ public static int rowCount; public static String[]item; public static int[][]qty ; } @Override public int print(Graphics g,PageFormat pf,int pageIndex) { if (pageIndex !=0) return NO_SUCH_PAGE; Graphics2D g2= (Graphics2D)g; int columnIndex2 =0; int j = 0; String itemw; String qtyw; float mmpt = 72/25.4f; g2.setFont(new Font(SANS_SERIF,PLAIN,20)); g2.drawString("向け配送商品",35*mmpt,40*mmpt); g2.setFont(new Font(SANS_SERIF,PLAIN,10)); g2.drawString("商品番号 商品名   個数",35*mmpt,40*mmpt); for (columnIndex2 = 2;columnIndex2<Klass.qty[0].length;columnIndex2++) { for (j=0;j<Klass.item.length;j++) { itemw = Klass.item[j]; qtyw =String.valueOf(Klass.qty[j][columnIndex2-2]); g2.drawString(itemw, 35*mmpt, (48+8*j)*mmpt); g2.drawString(qtyw, 40*mmpt, (48+8*j)*mmpt); } } return PAGE_EXISTS; } public static void main(String[]args) { try { Class.forName("org.h2.Driver");} catch(ClassNotFoundException e1) { e1.printStackTrace();} Connection con = null; try { con = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/mydb"); PreparedStatement pstmt = con.prepareStatement("SELECT * FROM ITEMS"); ResultSet rs = pstmt.executeQuery(); ResultSetMetaData meta = rs.getMetaData(); rs.afterLast(); Klass.rowCount = rs.getRow(); rs.beforeFirst(); int i; int columnIndex; int columnCount = meta.getColumnCount()+1; Klass.item = new String[Klass.rowCount]; Klass.qty = new int[columnCount][Klass.rowCount]; for (columnIndex = 2; columnIndex < columnCount;columnIndex++) { i=1; while(rs.next()) { Klass.item[i] = rs.getString(1); Klass.qty[i][columnIndex-2] = rs.getInt(columnIndex); i +=1; } } PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(new DataPrintable()); if (pj.printDialog()) { try{pj.print();} catch(PrinterException e) {System.out.println(e);}} } catch(SQLException e) {e.printStackTrace(); } finally { if(con != null) { try { con.close(); }catch(SQLException e) { e.printStackTrace(); } } } }

}```

試したこと

Klass クラスの配列Klass.item,Klass.qtyを初期化しようとした。=null;,=new String[]item;,new int[][]qty;では上記の絵r-メッセージが出て駄目だった。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

OS:windows10,エディター:Eclipse
ここにより詳細な情報を記載してください。

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

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

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

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

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

plasticgrammer

2021/01/08 05:14

コードの挿入(<code>ボタン)を使用して、質問内のコードが適切な書式になるよう修正してください。
y_waiwai

2021/01/08 05:14

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
m.ts10806

2021/01/08 05:25

投稿前に確認してください。 「どうなっていればOKか」は他の質問回答を確認してください。
onoko

2021/01/08 05:41

慣れていなくてすいません。
m.ts10806

2021/01/08 05:47

あくまで投稿前にプレビュー確認して調整するだけなので、そこは習慣かなと。 不要な情報がないか、必要な情報は書き出しているか 他人が見て読みづらくないか くらいは確認してください。
guest

回答1

0

ベストアンサー

エラーメッセージの「The field item cannot be declared static in a non-static inner type, unless initialized ith a constant expression.」ですが、要は「DataPrintableクラスのインナークラスとしたKlassは非staticクラスなので、staticフィールドを宣言できない」と言っています。
(※お使いのJDKのバージョンによるのでしょうか。私の使用環境とは違うメッセージでした)

このことに対する直接的な修正方法は、

Java

1public class DataPrintable implements Printable{ 2 public class Klass { 3 public static int rowCount; 4 public static String[]item; 5 public static int[][]qty; 6 } 7...

となっているところを、public static Klass { ... } つまり、

Java

1public class DataPrintable implements Printable{ 2 public static class Klass { 3 public static int rowCount; 4 public static String[]item; 5 public static int[][]qty; 6 } 7...

とすれば良いです。

余談ですが、

商品別配送先の二次元配列をmainクラスからprintクラスへわたすにのに、static変数を使って行おうとしています。配列の縦横はそのときによって不定なので、staticな配列の宣言にnullを入れたところ次のようなエラーメッセージが出て通りませんでした。
うまくクラス間で配列の受け渡しができる方法を教えてください。引数で処理しようともしましたが、インターフェイスのPrintableの存在が障害になり成功しませんでした。

について、違うクラス間でデータをやり取りする際に**(意外とありがちですが)良く分からんからとりあえずstaticなフィールドを経由しよう**と言うのは、オブジェクト指向的にはあまり良いことではありません。Printableインターフェースを使っていることが障害なのではなく、コードの組み方の問題です。本質問での本筋ではないと思うので代案は述べませんが、まずは現状のコードで要望の動きをするか確認し、余力があれば改修に挑戦してみても良いかと思います。

投稿2021/01/08 08:14

編集2021/01/08 08:28
dodox86

総合スコア9256

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

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

onoko

2021/01/08 08:53

static変数の使い方についてはご想像のとおり、恐れ入ります。グローバル変数の代わりに使いました。さてKlassクラスにstaticを付加したところ今度は続く3つのpublic static で始まるフィールド宣言文がエラーになりまた”The field XXXXX cannot be declared static in a non-static inner type, unless initialized with a constant expression."と出ました。staticについて知識が足りないもので私には不分明です。もう少しご教示のほどお願いします。
dodox86

2021/01/08 09:17

こちらでは同じエラーが再現しませんね。お使いのJDKのバージョンは何でしょうか。OracleのJDK、Open JDKなども含めてお知らせください。 コマンドラインでjavac -version などと実行してみてください。
dodox86

2021/01/08 09:23

ちなみにこちらはOracleのJDK Java SE11 です。バージョンとしては6から11までコンパイルはOKです。(実行についてはこちらは環境が整っていないので、エラーで終わります) C>java -version java version "11.0.9" 2020-10-20 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.9+7-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.9+7-LTS, mixed mode)
onoko

2021/01/08 09:25

Oracle JDK11.0.9 です。
dodox86

2021/01/08 09:34

バージョン自体は同じようですね。ちなみにこちらはWindows版です。エラーメッセージが異なるようなのもおかしいですが、ソースコードが違うということはありませんか。私は、今現在質問文中に提示されているJavaのコードをコピー&ペーストして「DataPrintable.java」として保存。 しかし元のコードの閉じカッコ"}"が足りないので末尾にひとつ追加します。その時点でコンパイルしてやっと以下のエラーになります。 ここから>>>> C>javac DataPrintable.java DataPrintable.java:21: エラー: 内部クラスDataPrintable.Klassの静的宣言が不正です public static int rowCount; ^ 修飾子'static'は定数および変数の宣言でのみ使用できます DataPrintable.java:22: エラー: 内部クラスDataPrintable.Klassの静的宣言が不正です public static String[]item; ^ 修飾子'static'は定数および変数の宣言でのみ使用できます DataPrintable.java:23: エラー: 内部クラスDataPrintable.Klassの静的宣言が不正です public static int[][]qty ; ^ 修飾子'static'は定数および変数の宣言でのみ使用できます エラー3個 <<<<ここまで で、次に「public class Klass」を「public static class Klass」に修正するとコンパイルは通るようになります。それが私の回答です。
dodox86

2021/01/08 09:39

ちなみに英語のエラーメッセージにすると以下のようになります。やはりちょっと違います。 C>javac -J-Duser.language=en DataPrintable.java DataPrintable.java:21: error: Illegal static declaration in inner class DataPrintable.Klass public static int rowCount; ^ ...以下、割愛
momon-ga

2021/01/08 10:17

メッセージは、Eclipseのメッセージだと思いますのでjavacのものとは違うみたいですね
dodox86

2021/01/08 11:19 編集

>@momon-ga さん コメントありがとうございます。なるほど、EclipseのJavaコンパイラ(ECJ - Eclipse Compiler for Java)のものかもしれませんね。 ※そうすると実はJavaのバージョンも古かったりして。
onoko

2021/01/08 11:37

コンパイル通りました。ありがとうございました。しかしどういうふうに解決したかというと、偶然だったのですが、静的なKlassクラスを動的なクラスDataPrintableの中に入れているからエラーをを起こすのだとばかり、Klassクラスを一回DataPrintableのかっこの外に出してみて、エラーを出したのち、やっぱりと元の位置に戻したら同じコードでもエラーが出なくなったのでした。何か書き直したKlassクラスには残存する誤ったコードの影響がありそれを完全に消去することで一掃し、もう一度外部から正しいまっさらなコードをコピーして初めて文言通りにコンパイルされたという感じです。  助かりました。明晰で卓越したご助力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問