<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    心的方向

    新的征途......
    posts - 75,comments - 19,trackbacks - 0

    本文鏈接: http://blog.csdn.net/jrq/archive/2005/10/27/517428.aspx

    正文:

    1. 為了方便按列作外循環,想把ArrayList構造成一個二維數組,如下:

        ......

      ArrayList result=GetResult();

      int n=result.size();

      String[][] myArray=new String[n][]; //定義二維數組
     
      for (int i=0;i<n;i++)  //構造二維數組
      {
        ArrayList tempArray= (ArrayList)result.get(i);
        myArray[i]=(String[])tempArray.toArray();
      }

      ......

    程序可以編譯通過。

    但在運行到myArray[i]=(String[])tempArray.toArray()時,出現java.lang.ClassCastException的錯誤,很奇怪。

    花了一晚上時間,查了N多資料,總算搞定了?,F把問題記錄下來,以備參考。

    2. 此事從頭說起?! ?/p>

    ArrayList類擴展AbstractList并執行List接口。ArrayList支持可隨需要而增長的動態數組。

        ArrayList有如下的構造函數:
      
            ArrayList( )
            ArrayList(Collection c)
            ArrayList(int capacity)

    如果調用new ArrayList()構造時,其默認的capacity(初始容量)為10。

    參見ArrayList源碼,其中是這樣定義的:

        public ArrayList() {
      this(10);
         }

    默認初始化內部數組大小為10。為什么是10?不知道??赡躍UN覺得這樣比較爽吧。

    程序編譯后執行ArrayList.toArray(),把ArrayList轉化為數組時,該數組大小仍為capacity(為10)。

    當 裝入的數據和capacity值不等時(小于capacity),比如只裝入了5個數據,數組中后面的(capacity - size)個對象將置為null,此時當數組強制類型轉換時,容易出現一些問題,如java.lang.ClassCastException異常等。

    解決辦法是:在用ArrayList轉化為數組裝數據后,使用trimToSize()重新設置數組的真實大小。


    3. 本例修改后的代碼修如下,可順利運行:

        for (int i=0;i<n;i++)  //構造二維數組
          {
                ArrayList tempArray= (ArrayList)result.get(i);
                myArray[i]=(String[])tempArray.toArray(new String[0]);   //注意此處的寫法
           }

     看看下面這些也許就明白了--

    ArrayList.toArray()之一:

    public Object[] toArray() {
      Object[] result = new Object[size];
      System.arraycopy(elementData, 0, result, 0, size);
      return result;
    }

    返回ArrayList元素的一個數組,注意這里雖然生成了一個新的數組,但是數組元素和集合中的元素是共享的,Collection接口中說這個是安全的,這是不嚴格的。

    下面的例子演示了這個效果。
     
       ArrayList al=new ArrayList();
       al.add(new StringBuffer("hello"));
       Object[] a=al.toArray();
       StringBuffer sb=(StringBuffer)a[0];
       sb.append("changed");  //改變數組元素同樣也改變了原來的ArrayList中的元素
       System.out.println(al.get(0));    

    這里不要用String來代替StringBuffer,因為String是不可變的。


    ArrayList.toArray()之二:

    public Object[] toArray(Object a[]) {
      if (a.length < size)
        a = (Object[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);
       System.arraycopy(elementData, 0, a, 0, size);
       if (a.length > size)
          a[size] = null;
       return a;
    }

    這個方法有可能不需要生成新的數組,注意到如果數組a容量過大,只在size處設置為null。

    如果這個數組a足夠大,就會把數據全放進去,返回的數組也是指向這個數組,(數組多余的空間存儲的是null對象);要是不夠大,就申請一個跟參數同樣類型的數組,把值放進去,然后返回。


    4. 網上的資料一:

      public String[] getPlatformIDList()
     
      {
            Vector result = new Vector();
            try
            {
                Statement stmt = conn.createStatement();
                String sql = "SELECT PlatformID FROM Platform";
                rs = stmt.executeQuery(sql);
                while(rs.next())
                {
                    result.add(rs.getString(1));
                }       
                if (result.size() > 0)
                {
                    String[] str = (String[]) result.toArray(); // 出現ClassCastException
                    return str;
                }
                else
                    return null;
            }
            catch(Exception e)
            {
                System.err.println(e);
                return null;
            }
            finally
            {
                try
                {
                    rs.close();
                    conn.close();
                }
                catch(Exception e2)
                {}
            }
        }

        程序運行后,發現不能將Vector類經過toArray()方法得到的Object[]直接轉換成String[]。

        找到用另一個帶有參數的 toArray(T[] a)方法才可以。

        將該語句改為:

        String[] str = (String[]) result.toArray(new String[1]);即告訴Vector,我要得到的數組的類型。

        回想一下,應該是java中的強制類型轉換只是針對單個對象的,想要偷懶,將整個數組轉換成另外一種類型的數組是不行的。


    5. 網上的資料二:

        正確使用List.toArray()--
     
       在程序中,往往得到一個List,程序要求對應賦值給一個array,可以這樣寫程序:
     
        Long [] l = new Long[list.size()];
        for(int i=0;i<list.size();i++)
            l[i] = (Long) list.get(i);
     
        要寫這些code,似乎比較繁瑣,其實List提供了toArray()的方法。
        但是要使用不好,就會有ClassCastExceptiony異常。究竟這個是如何產生的,且看代碼:

            List list = new ArrayList();
            list.add(new Long(1));list.add(new Long(2));
            list.add(new Long(3));list.add(new Long(4));
            Long[] l = (Long[])list.toArray();
            for(int i=0; i<l.length; i++)
                System.out.println(l[i].longValue());

        紅色代碼會拋java.lang.ClassCastException。

        當然,為了讀出值來,你可以這樣code:

            Object [] a =  list.toArray();
            for(int i=0;i<a.length;i++)
                System.out.println(((Long)a[i]).longValue());

        但是讓數組丟失了類型信息,這個不是我們想要得。


        toArray()正確使用方式如下:

            1)  Long[] l = new Long[<total size>];
                  list.toArray(l);
     
            2)  Long[] l = (Long []) list.toArray(new Long[0]);

            3)  Long [] a = new Long[<total size>];
                  Long [] l = (Long []) list.toArray(a);

    6. 總結補充:

          java sdk doc 上講:
     
          public Object[] toArray(Object[] a)

          a--the array into which the elements of this list are to be stored, if it is big enough; otherwise, a new array of the same  runtime type is allocated for this purpose.

          如果這個數組a足夠大,就會把數據全放進去,返回的數組也是指向這個數組,(數組多余的空間存儲的是null對象);要是不夠大,就申請一個跟參數同樣類型的數組,把值放進去,然后返回。
     
         需要注意的是:你要是傳入的參數為9個大小,而list里面有5個object,那么其他的四個很可能是null , 使用的時候要特別注意。

    7. 完畢。

     

                                                                                                                  J.R.Q.

                                                                                                        2005.10.27凌晨于廣州 

    posted @ 2010-06-25 00:49 阿偉 閱讀(1214) | 評論 (0)編輯 收藏

    之前看網上有人發帖說有個解決辦法是viewservlet.jar下找到org/eclipse/birt/report/utility下找到ParameterAccessor.class文件,現在要修改這個文件的源代碼, 

    你可以在你從CVS中簽出的源代碼中的org.eclipse.birt.report.viewer/birt/WEB-INF/classes/org/eclipse/birt/report/utility文件夾中找到ParameterAccessor.java文件,在這個java文件中找到這行:

    public static final String UTF_8_ENCODE = "UTF-8"; //$NON-NLS-1$

    將這行改為

    public static final String UTF_8_ENCODE = "GBK"; //$NON-NLS-1$

    然后將這個編譯好的class文件壓縮到viewservlets.jar的同等目錄下,替換原來的文件”,本人也試了這種方法,但沒見湊效,不過上面的解決方法好像是在birt2.1的環境下,這個沒仔細試,也許對birt2.1有效吧。


    本人使用birt版本2.3,解決辦法如下:
    在JSP中調用BIRT報表時,傳的參數中有中文字符,即URL中包含中文字符,這時在BIRT端接收到的參數拼SQL語句后發現中文字符被轉碼,造成SQL中的條件不正確。
    因為在JSP中調用BIRT是在一個JS腳本中,因此要想辦法在JS中先將中文轉成UTF-8,并且在BIRT獲取參數后再將UTF-8轉換回中文即可。
    實現代碼:
    頁面JS:
    Var mychecktype = “中文”;
    sqlWhere+="and t.CHECK_TYPE = '"+escape(encodeURI(mychecktype))+"'";

    BIRT腳本:
    sql+=decodeURI(mycondition);

    posted @ 2009-07-02 09:56 阿偉 閱讀(2536) | 評論 (1)編輯 收藏
     問題:

    頁面中寫了一個函數a,在另一個函數中調用,頁面用的是一個iframe框架,即通過iframesrc參數來刷新iframe中的頁面,每次在第一次調用函數a時沒問題,但第二次點擊按鈕調用函數a時老報“缺少函數”的錯誤?

    function a(var1)
    {
      ...
      return a;
    }

    第一次 alert(a(var1)) 沒有問題,第二次就出錯了

    解決:
     

    后來發現函數中返回值變量名和函數名定義為同一個名字,把返回值變量名改成其它名字后問題就解決了,好弱的一個問題啊,折騰了我半天,氣憤!

    改成 return b 就好了 -_-

    posted @ 2008-11-27 14:58 阿偉 閱讀(2265) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 永久免费AV无码网站在线观看| a级精品九九九大片免费看| 久久ww精品w免费人成| 亚洲精品成人片在线观看精品字幕| 亚洲AV无码AV男人的天堂不卡 | 男男gay做爽爽的视频免费| 久久精品免费一区二区喷潮| 亚洲毛片免费视频| 啦啦啦完整版免费视频在线观看 | 久久久久久国产精品免费无码| 国产成人精品日本亚洲| 亚洲一卡2卡3卡4卡5卡6卡| 91免费国产在线观看| 国产亚洲av人片在线观看| 国产黄色免费观看| 亚洲日韩精品无码一区二区三区| 国产精品免费久久| 亚洲中文字幕无码一久久区| 免费无码作爱视频| 亚洲永久永久永久永久永久精品| 特级做a爰片毛片免费看| 亚洲精品网站在线观看不卡无广告 | 久久亚洲国产精品五月天| 一级毛片免费观看| 亚洲日本久久一区二区va| 一区二区免费视频| 亚洲人成网网址在线看| 国产免费怕怕免费视频观看| 黄床大片免费30分钟国产精品| 国产AV无码专区亚洲Av| 30岁的女人韩剧免费观看| 国产亚洲精品bv在线观看| 免费v片视频在线观看视频| 中文字幕在线免费视频| 亚洲美女大bbbbbbbbb| 在线免费观看色片| 国产va免费观看| 亚洲欧洲国产视频| 亚洲 小说区 图片区 都市| 两个人看www免费视频| 中文字幕亚洲综合久久综合 |