استثناء في تنفيذ التزلج الأبلهوديل في جافا؟

StackOverflow https://stackoverflow.com/questions/2202504

  •  18-09-2019
  •  | 
  •  

سؤال

لقد قمت بتنفيذ نموذج جدول مخصص كما يلي:

public class MyTableModel extends AbstractTableModel {
    ...
    ...
    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }
    ...
    ...
}

أحصل على nullpointerexception التي ألقيت بها الطريقة المذكورة أعلاه، عندما أقوم بعرض JTable وجود سطح الطاولة أعلاه.

أعتقد أن الاستثناء يرجع إلى بعض الخلايا الفارغة في جدول قاعدة البيانات.

إذا كان الاستثناء يرجع إلى خلايا فارغة في جدول قاعدة البيانات، فهذا كيفية التجول في هذه المشكلة؟

ليس إلزاميا لكل عمود في قاعدة البيانات للحصول على بعض القيمة. بعض الأعمدة لا يمكن أن لا تحتوي على أي شيء.

هل كانت مفيدة؟

المحلول

إذا كانت الخلايا يمكن أن تحتوي على قيم فارغة، فإن استدعاء getclass () على قيمة فارغة سوف تعطيك بالتأكيد NPE. بالتأكيد يمكنك التحقق من وجود لاغية، ولكن مشكلتك الحقيقية هي أكثر دقة من ذلك.

واجهة TableModel تحدد ذلك getcolumnclass (int) يجب العودة "Superclass الأكثر تحديدا لجميع قيم الخلايا في العمود". من مظهر الأشياء، يمكنك إرجاع أي عدد من أنواع الفئة لعمدة واحدة، مما يؤدي إلى كسر عقد Passhemodel بشكل فعال.

عادة ما تكون أنواع الأعمدة ثابتة لمجموعة معينة من بيانات الجدول، مما يعني أن الفئة لعمود يجب أن تتغير ما لم تتغير بيانات الجدول الأساسي. أعتقد أنه من المهم أن نسأل لماذا تحتاج إلى إعادة مثل هذه القيمة المحددة.

في الحالة التي تريد فيها تقديم شيء محدد لنوع فئة معينة، فأنت أفضل حالا TableCellRenderer., وتحديد نوع الكائن على أساس كل خلايا. من هناك يمكنك القيام بأي تقديم محدد حسب الحاجة.

نصائح أخرى

مشكلة واحدة هي السبب في أنك تحصل على NULL لهذه الإحداثيات المحددة. إذا كان الأمر مشروعا ولا تريد فقط أن يتم تقديم أي شيء خاص، فما الذي تحتاج إلى القيام به هو فحص Null-Check وإرجاع كائن. مكيف، على سبيل المثال،

   public Class getColumnClass(int c) {
        Object o = getValueAt(0, c);
        if(o==null) return Object.class;
        return o.getClass()
    }

سيضمن ذلك استخدام العارض الافتراضي، وبما لا توجد قيمة، لن يتم تقديم أي شيء.

ربما:

public Class getColumnClass(int c) {
        return (getValueAt(0, c) == null ? Object.class : getValue(0, c).getClass());
  }

وآمل أن يساعد أنت.

بالإضافة إلى الإجابات حتى الآن: على افتراض أن النموذج الخاص بك مدعوم به List (كما اقترح في سؤالك السابق) سترى IndexOutOfBoundsException إذا حاول تقديم الخاص بك JTable عندما TableModel لا يحتوي على صفوف (أي List فارغ). هذه حالة حافة سيئة (كما أدرك أنك تحاول تقديم ResultSet - كيف تعرف ResultSet لن تكون فارغة؟).

لتجنب ذلك، لماذا لم تفعل ما اقترحته في الأصل وتحديد فئة كل عمود من ResultSetMetaData?

لا تقدم النتائج Tadata أي معلومات حول الفصل. إنه يوفر أنواع بيانات خاصة بقاعدة البيانات التي لا تستخدمها تلقائيا إلى فئات Java (على سبيل المثال، "CIDR" أو "INT8" في عالم PostgresQL) لذلك هذا الاقتراح (الذي لم يتضمن أي شفرة مصدر، بالمناسبة) ليس مفيدا في الواقع.

أيضا، التعليق "أعتقد أنه من المهم أن تسأل لماذا تحتاج إلى إعادة مثل هذه القيمة المحددة" من قبل جيسون نيكولز يظهر جوايا عامة حول كيفية استخدام فئة JTable في العالم الحقيقي.

أود أن أجد حلا لهذه المشكلة حيث تحتوي الجداول على صفوف صفرية، حيث لا يزال بإمكاني معرفة ما هي فئة Java هي أنه يجب أن أستخدمها لتقديم خلايا بلدي للعمود بأكمله. تعتمد فكرة أن الإخراج يمكن أن تتغير في جواؤ أكثر من قواعد البيانات - يتم تحديد نوع بيانات العمود في تعريف ذلك العمود، بغض النظر عن محتوياته لا يتغير نوع البيانات حسب الصف الذي أنت عليه إعادة النظر في ذلك.

بالطبع إحدى التحديات التي تحتوي على قواعد البيانات هي أن تعريفات الأعمدة قد تسمح أو لا تسمح بالقيم الخالية، وينبغي أن يفهم أي شخص يبلغ من الفئة الفرعية لهذا الفرضية الأساسية للغاية ومعرفة كيفية اختبار هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top